Go 的資料型別總結

xing393939發表於2020-12-01
元素 零值 初始化 型別 型別後設資料
bool false := true 值型別 Bool
字元(string) “” := “word” 值型別 String
數字(int) 0 := 1 值型別 Int
陣列 取決於子元素 := [N]元素{…} 值型別 arraytype
Struct 取決於子元素 := 結構{…} 值型別 structtype
指標 nil := &v 引用 ptrtype
Slice nil := make([]元素, len, cap) 引用 slicetype
Map nil := make(map結構, hint) 引用 maptype
Channel nil := make(channel 元素, size) 引用 chantype
Func nil := func結構 引用 functype
Interface nil 介面不能被初始化 引用 interfacetype

PS1:map的key不能是func、map、slice
PS2:make map的第二個引數hint是估算值:hmap.B剛好滿足hint < 6.5 * 2 ^ B。參考Golang Map 實現 (二) map 的建立

能和nil值比較的6種型別

  • 深度剖析 Go 的 nil
    元素 資料結構 nil賦值 nil值判斷
    指標 uintptr 8位元組置0 值是否為0
    Slice slice{} 24位元組置0 data指標是否為0,無視len、cap
    Map &hmap{} 8位元組置0 8位元組是否為0
    Channel &hchan{} 8位元組置0 8位元組是否為0
    Func uintptr 8位元組置0 8位元組是否為0
    Interface efaceiface 16位元組置0 _type為0,無視data

型別比較

  • 淺析go中的型別比較
  • 按型別分類
    1. 基本型別:整型、浮點型、複數型、布林型、字串
    2. 複合型別:array、struct
    3. 引用型別:slice、map、func、channel、指標
    4. 介面型別:runtime.eface結構體、runtime.iface結構體
  • 可比較型別:
    1. 基本型別:都可以
    2. 複合型別:如果含有不可比較型別,則不可比較
    3. 引用型別:可比較的有channel和指標,其他不可(只能和nil比較)
    4. 介面型別:
      • runtime.eface結構體,可比較,當型別相同且值相同時才為true
      • runtime.iface結構體,一個介面可以轉化成另一個介面,則可比較
  • reflect.DeepEqual函式可以用來比較兩個任意型別的變數

程式碼示例

sliceB = sliceA      //淺複製,記憶體指標一樣
copy(sliceB, sliceA) //深複製,兩塊記憶體

// runtime.eface結構體
var a interface{} = 0
var b interface{} = 2
println(a == b)

// runtime.iface結構體
var f *os.File
var f1 io.Reader = f
var f2 io.ReadCloser = f
var f3 io.Writer = f
println(f1 == f2) //可比較
println(f1 == f3) //編譯報錯
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章