1 回答

TA貢獻1780條經驗 獲得超5個贊
go 中沒有“引用”類型,指針和其他任何東西一樣都是一個值,你當然可以得到指針本身的大小。您還混淆了您想要的大小的reflect.Value、 theinterface{}和實際值。導致這種混淆的原因是包unsafe是特殊的,它不接受接口值,而是可以直接接受任何值,這由編譯器正確處理。
您可以通過單獨的調用處理指針和結構,或者檢查您是否有指針并調用Elem():
// struct
reflect.ValueOf(i).Type().Size()
// pointer
reflect.ValueOf(i).Elem().Type().Size()
但是,由于可選地取消引用指針是很常見的,您可以使用reflect.Indirect一次處理這兩種類型:
reflect.Indirect(reflect.ValueOf(i)).Type().Size()
https://play.golang.org/p/og-uMDXCmEr
作為參考,一些嘗試實際采取的描述:
// size of the interface value
unsafe.Sizeof(valueObject)
// size of reflect.Value
unsafe.Sizeof(reflect.ValueOf(valueObject))
// size of the reflect.Value type
reflect.TypeOf(reflect.ValueOf(valueObject)).Size()
// size of the interface value
unsafe.Sizeof(referenceObject)
// size of the reflect.Value
unsafe.Sizeof(reflect.ValueOf(referenceObject))
// size of the pointer value
reflect.TypeOf(referenceObject).Size()
// size of the reflect.Value type
reflect.TypeOf(reflect.ValueOf(referenceObject)).Size(),
// size of the of reflect.Value type again
reflect.TypeOf(reflect.ValueOf(referenceObject).Elem()).Size()
// size of the reflect.Value
unsafe.Sizeof(reflect.ValueOf(referenceObject).Elem()),
// size of the reflect.Type interface value
unsafe.Sizeof(reflect.TypeOf(reflect.ValueOf(referenceObject).Elem())),
- 1 回答
- 0 關注
- 141 瀏覽
添加回答
舉報