首頁 > 後端開發 > Golang > 主體

我如何一般性地決定任何 Go 結構的大小?

DDD
發布: 2024-11-26 07:58:08
原創
801 人瀏覽過

How Can I Generically Determine the Size of Any Go Structure?

如何建立通用函數來決定 Go 中任何結構的大小

程式設計中經常執行的任務之一是決定結構的大小。在 Go 中,這可以使用 unsafe.Sizeof 函數來實現。然而,創建一個可以處理任何類型結構的泛型函數有點具有挑戰性。

問題

建立泛型函數的常見方法是使用介面和反思。但是,使用如下所示的方法會產生不正確的結果:

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,因為它確定Reflect.Value 結構的大小,而不是儲存在介面中的實際結構的大小.

要解決此問題,請使用reflect.Type而不是reflect.Value來取得尺寸資訊。 Reflect.Type 類型有一個 Size() 方法,它會傳回對應類型的大小:

size := reflect.TypeOf(T).Size()
登入後複製

使用這種方法,程式碼提供了正確的結果 40,考慮了結構內的填充。

以上是我如何一般性地決定任何 Go 結構的大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板