2017-06-14 53 views
1

我想要在GAE/Go中獲得結構的大小。在GAE/Go中獲取結構的大小

我讀this後,並寫下如下代碼。

import (
    "reflect" 
    "unsafe" 
) 

func GetSize(T interface{}) { 
    size := reflect.TypeOf(T).Size() 
    return int((*int)(unsafe.Pointer(size))) 
} 

但此代碼不起作用,因爲GAE不允許導入unsafe

如何在GAE/Go中做到這一點?

回答

2

您提出的解決方案不是有效的代碼,它有多個錯誤。

例如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?