ホームページ > バックエンド開発 > Golang > リフレクションを使用して Go で構造体のサイズを取得するにはどうすればよいですか?

リフレクションを使用して Go で構造体のサイズを取得するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-28 01:40:14
オリジナル
515 人が閲覧しました

How Can I Get the Size of Any Structure in Go Using Reflection?

Go で任意の構造体のサイズを取得する汎用関数

問題:
目標は、 Go の汎用関数で、任意の構造体のサイズを決定できます。 C.

コードとエラー:
提供されたコードは、リフレクションを使用して構造体のサイズを取得します。ただし、オブジェクトに反映するのではなく、reflect.Value 構造体に反映すると、誤った結果が得られます。問題のコードは次のとおりです:

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) // Prints 12, which is incorrect
}
ログイン後にコピー

解決策:
この問題を解決するには、オブジェクトの値ではなく型を考慮する必要があります。 Reflect.Type には、正しいサイズを提供する Size() メソッドがあります。更新されたコードは次のとおりです:

package main

import (
    "fmt"
    "reflect"
)

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)
    size := v.Type().Size()
    fmt.Println(size) // Prints 40, which is correct
}
ログイン後にコピー

説明:
修正されたコードは、reflect.Type の Size() メソッドを使用しており、リフレクションによるオーバーヘッドなしで構造体のサイズを返します。 .

以上がリフレクションを使用して Go で構造体のサイズを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート