1. ホーム
  2. go

[解決済み] Goで構造体のフィールドを反復処理する

2022-02-10 02:58:27

質問

基本的に、私が知っている唯一の方法は、以下のフィールドの値を反復処理することです。 struct は、こんな感じです。

type Example struct {
    a_number uint32
    a_string string
}

//...

r := &Example{(2 << 31) - 1, "...."}:
for _, d:= range []interface{}{ r.a_number, r.a_string, } {
  //do something with the d
}

を実現するための、より良い、より汎用的な方法はないものかと考えていました。 []interface{}{ r.a_number, r.a_string, } または、構造体をループで処理する良い方法はありますか?

に目を通そうとしたのですが reflect を取り出すと、どうすればいいのかわからなくなり、壁に突き当たります。 reflect.ValueOf(*r).Field(0) .

ありがとうございます。

解決方法は?

を取得した後 reflect.Value を使用して、フィールドの Field(i) を取得することができます。 を呼び出すことで、インターフェイスの値を取得することができます。 Interface() . このインターフェース値は フィールドの値です。

フィールドの値を具象型に変換する関数は存在しない。 ご存知のように、goにはジェネリックがありません。したがって GetValue() TT はそのフィールドのタイプです(もちろん、フィールドによって変わります)。

goで実現できる最も近いものは GetValue() interface{} であり、これはまさに reflect.Value.Interface() を提供します。

次のコードは、構造体のエクスポートされた各フィールドの値を取得する方法を示しています。 を使用して、リフレクション( 遊ぶ ):

import (
    "fmt"
    "reflect"
)

func main() {
    x := struct{Foo string; Bar int }{"foo", 2}

    v := reflect.ValueOf(x)

    values := make([]interface{}, v.NumField())

    for i := 0; i < v.NumField(); i++ {
        values[i] = v.Field(i).Interface()
    }

    fmt.Println(values)
}