golang interface記憶體佈局
偶然看到一段有意思的代碼:
package main
import (
"fmt"
)
type Person struct {
name string
age int
tel string
}
func main() {
var man *Person = nil
var ai interface{} = man
var ei interface{} = nil
fmt.Printf("ai == nil: %v\n", ai == nil)
fmt.Printf("ai == ei: %v\n", ai == ei)
fmt.Printf("ei == man: %v\n", ei == man)
fmt.Printf("ei == nil: %v\n", ei == nil)
}
輸出:
ai == nil: false
ai == ei: false
ei == man: false
ei == nil: true
我以前是用c++,對輸出覺著很奇怪。通過列印記憶體man,ai,ei三個變數記憶體情況,發現interface在golang內部其實是一個結構體,
有_type,data兩個指針組成,_type存數據類型,data存值,如下圖:
這樣輸出就很好理解了
PS:1、看記憶體需要添加編譯選項,保證不被編譯器優化變數值,go build -gcflags "-N -l".
LiteIDE這樣設置:編譯->編譯配置,設置編譯參數。在BUILDARGS添加-gcflags "-N -l"
2、當使用interface自定義介面時與上面還有點不一樣,感興趣的可以自己列印看看,
或者參考這位兄弟:http://compasses.github.io/2015/10/23/golang-interface-analysis-by-gdb/