1.1 nil是一個零值變數
從定義可以看出nil是一個預定義的變數,並且是以下型別的變數:
指標、管道、函式、介面、Map、切片
// nil is a predeclared identifier representing the zero value for a // pointer, channel, func, interface, map, or slice type. var nil Type // Type must be a pointer, channel, func, interface, map, or slice type
1.2 空結構體
1.2.1 大小為0
1.2.2 都指向同一個地址zerobase(不被包含在其他結構體中時)
runtime\malloc.go
// base address for all 0-byte allocations var zerobase uintptr
1.2.3 作為結構體欄位的偏移
只有一個空介面體欄位時
結構體本身和其欄位都指向zerobase
當有其他欄位時,並且空結構體欄位處於第一個欄位時
空結構體欄位和整個變數的地址及第二個欄位的地址一樣
當有其他欄位時,並且空結構體欄位處於中間欄位時
空結構體欄位的地址會緊跟前一個位元組的末尾
當有其他欄位時,並且空結構體欄位處於最後欄位時
空結構體欄位的地址會緊跟前一個位元組的末尾,但會進行填充,並且填充長度與前一個欄位相同。
1.3 空介面
空介面的底層實現是eface,_type欄位儲存具體物件的型別,data欄位儲存具體物件的值
type eface struct { _type *_type // data unsafe.Pointer // }
細節:只有當eface的兩個欄位都為nil時,eface才為nil