元素 | 零值 | 初始化 | 型別 | 型別後設資料 |
---|---|---|---|---|
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中的型別比較
- 按型別分類
- 基本型別:整型、浮點型、複數型、布林型、字串
- 複合型別:array、struct
- 引用型別:slice、map、func、channel、指標
- 介面型別:runtime.eface結構體、runtime.iface結構體
- 可比較型別:
- 基本型別:都可以
- 複合型別:如果含有不可比較型別,則不可比較
- 引用型別:可比較的有channel和指標,其他不可(只能和nil比較)
- 介面型別:
- 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 協議》,轉載必須註明作者和本文連結