您提出的解決方案不是有效的代碼,它有多個錯誤。
例如GetSize()
沒有結果類型,所以你不能返回任何東西。
接下來,您返回的表達式也是語法錯誤,它會嘗試將*int
指針轉換爲無效的int
。
您需要取消引用指針第一,所以正確的語法是:
func GetSize(T interface{}) int {
size := reflect.TypeOf(T).Size()
return int(*(*int)(unsafe.Pointer(size)))
}
不過。它沒有任何意義。 reflect.Type.Size()
已經返回大小(存儲給定類型的值所需的字節數),所以不需要這種魔法。可能令人困惑的是,它的返回類型是uintptr
,但是您可以在將其轉換爲int
後簡單地使用該值。
只需使用:
func GetSize(v interface{}) int {
return int(reflect.TypeOf(v).Size())
}
測試它:
fmt.Println("Size of int:", GetSize(int(0)))
fmt.Println("Size of int64:", GetSize(int64(0)))
fmt.Println("Size of [100]byte:", GetSize([100]byte{}))
輸出(嘗試在Go Playground):
Size of int: 4
Size of int64: 8
Size of [100]byte: 100
有一件事你一定不要忘記:這GetSize()
會不能重新檢查通過價值的大小。例如,如果它是一個帶有指針字段的結構,它不會「計數」指向值的大小,只會指向指針字段的大小。
構造一個GetSize()
,因爲像map
這樣的類型,重新計數複雜數據結構的總大小並不重要。詳情請參閱How to get variable memory size of variable in golang?