1. 程式人生 > 程式設計 >Go語言基礎篇(2) —— Go語言常用的資料結構

Go語言基礎篇(2) —— Go語言常用的資料結構

學習目標

掌握常見資料型別的使用

布林型別

var v1 bool //預設值為false
v1 = true 
v2 := (1 == 2) // v2也會被推導為bool型別 複製程式碼

數值型別

整型:

int8、byte、int16、int、uint、uintptr等。

型別
長度(位元組) 取值範圍
int8
1
-128 ~ 127
uint8(即byte) 1
0 ~ 255
int16
2
-32 768 ~ 32 767
uint16
2
0 ~ 65 535
int32
4
-2 147 483 648 ~ 2 147 483 647
uint32
4
0 ~ 4 294 967 295
int64
8
-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807
uint64
8
0 ~ 18 446 744 073 709 551 615
int
平臺相關
平臺相關
uint
平臺相關
平臺相關
uintptr
同指針
在32位平臺下為4位元組,64位平臺下為8位元組

int和int32在Go語言裡被認為是兩種不同的型別,編譯器也不會幫你自動 做型別轉換

支援的位運運算元:

浮點型別:

float32、float64。

不能直接用==來判斷兩個浮點數是否相等

可以這樣判斷浮點型的大小:

import "math" 
 
// p為使用者自定義的比較精度,比如0.00001 
func IsEqual(f1,f2,p float64) bool {   
    return math.Fdim(f1,f2) < p  
} 複製程式碼

複數型別:

complex64、complex128。

複數實際上由兩個實數(在計算機中用浮點數表示)構成,一個表示實部(real),一個表示 虛部(imag)。如果瞭解了數學上的複數是怎麼回事,那麼Go語言的複數就非常容易理解了。

  1. 複數表示

複數表示的示例如下:

   var value1 complex64    // 由2個float32構成的複數型別 
   value1 = 3.2 + 12i
   value2 := 3.2 + 12i     // value2是complex128型別 
   value3 := complex(3.2,12)  // value3結果同 value2 複製程式碼

  1. 實部與虛部

對於一個複數z = complex(x,y),就可以通過Go語言內建函式real(z)獲得該複數的實 部,也就是x,通過imag(z)獲得該複數的虛部,也就是y。

go語言不支援隱式轉換(對比Java的隱式轉換)

------

字串:string。

var str string  // 宣告一個字串變數,預設值為""複製程式碼

切片和陣列

陣列宣告:

//陣列定義
var a[3]int //宣告並初始化預設值為0
a[0] = 1 //給第一個數賦值為1
b := [3]int{1,2,3} //宣告同時初始化
c := [2][2]int{1,2},{3,43} //多維陣列初始化
d := [...]int{1,3,4,5}//自動匹配長度
複製程式碼

陣列遍歷:

    arr3 := [...]int{1,5}

    for i := 0; i < len(arr3); i++ {
        t.Log(arr3[i])
    }
    
    //i 是索引,不使用索引用_代替
    for i,e := range arr3 {
        t.Log(e,i)
    }複製程式碼

陣列的擷取:

a[開始索引(包含),結束索引(不包含)]

a := [...]int{1,5} 
a[1:2] //結果: 2
a[1:3] //結果: 2,3
a[1:Len(a)] //結果: 2,5 
a[1:] //結果: 2,5 
a[:3] //結果: 1,3複製程式碼

切片

類似於Java中的集合List

切片宣告:

//切片定義
var s0 [] int //初始長度為0
s0 = append(s0,1)//填充資料

s := []int{}
s1 := []int{1,3} 

/*
 格式: type,len,cap
 其中len個元素會被初始化為預設零值,未初始化元素不可以訪問,既,索引為0,1,2的值初始化為0可以訪問,4不可以
 訪問
 cap按2倍增長(類似於Java中list長度的增長因子)
*/
s2 := make([]int,5)/
複製程式碼

map

map的宣告:

var 變數名 map[key型別] value型別

m := map[string]int{"one": 1,"two": 2,"three": 3}

m1 :=map[string]int{}
m1["one"]=1//向容器中存入資料

m2 :=make(map[string]int,100 )//設定容量

//判斷值是否存在
if v,ok := m1["one"]; ok {
    //值存在
}
複製程式碼

注意:

當key不存在時:會輸出預設值

當key對應的值不存在時:也會返回預設值

map的遍歷:

    m1 := map[int]int{1: 1,2: 4,3: 9}
    //a是key b是value
    for a,b := range m1 {
        t.Log(a,b)
    }
    //k是key
    for  k := range m1  {
        t.Log(k)
    }
複製程式碼