2015-07-10 48 views
5

我寫一個通用的函數得到任何類型的結構和返回結構的大小,類似於C語言的sizeof功能。泛型函數來得到任何結構的尺寸在golang

我想使用接口和反射來做到這一點,但我無法得到正確的結果。代碼如下

package main 

import (
    "fmt" 
    "reflect" 
    "unsafe" 
) 

func main() { 
    type myType struct { 
     a int 
     b int64 
     c float32 
     d float64 
     e float64 
    } 
    info := myType{1, 2, 3.0, 4.0, 5.0} 
    getSize(info) 
} 

func getSize(T interface{}) { 
    v := reflect.ValueOf(T) 
    const size = unsafe.Sizeof(v) 
    fmt.Println(size) 
} 

此代碼返回錯誤的結果爲12.我對golang很新,請在此幫助我。

回答

8

您會得到reflect.Value結構的大小,而不是接口T中包含的對象的大小。幸運的是,reflect.TypeSize()方法:

size := reflect.TypeOf(T).Size() 

這給我40,這使得因填充感。

+0

謝謝。它運行良好 – sujin

+4

或者,您可以使用'unsafe.Sizeof(myType {})'。 – thwd

+0

@thwd你是對的,但我的getSize函數必須找到任何結構的大小,它必須在運行時找到結構的類型。正因爲如此,我選擇了反映包裝 – sujin