ホームページ > バックエンド開発 > Golang > Go 構造のサイズを一般的に決定するにはどうすればよいですか?

Go 構造のサイズを一般的に決定するにはどうすればよいですか?

DDD
リリース: 2024-11-26 07:58:08
オリジナル
832 人が閲覧しました

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

Go で任意の構造体のサイズを決定するジェネリック関数を作成する方法

プログラミングで一般的に実行されるタスクの 1 つは、構造物のサイズ。 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)
}
ログイン後にコピー

このコードは、インターフェイスに格納されている実際の構造体ではなく、reflect.Value 構造体のサイズを決定するため、誤った結果 12 を返します。 .

解決策

この問題を解決するには、reflect.Value の代わりにreflect.Type を使用します。サイズ情報を取得します。 reflect.Type 型には、対応する型のサイズを返す Size() メソッドがあります。

size := reflect.TypeOf(T).Size()
ログイン後にコピー

このアプローチを使用すると、コードは構造内のパディングを考慮して、正しい結果 40 を提供します。

以上がGo 構造のサイズを一般的に決定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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