ホームページ  >  記事  >  バックエンド開発  >  リフレクションを使用して構造を再帰的に反復し、フィールドを設定します

リフレクションを使用して構造を再帰的に反復し、フィールドを設定します

WBOY
WBOY転載
2024-02-10 20:45:10585ブラウズ

リフレクションを使用して構造を再帰的に反復し、フィールドを設定します

php エディタ Xigua は、この記事でリフレクション再帰を使用して構造を反復し、フィールドを設定する方法を紹介します。リフレクションは、実行時にクラス、メソッド、プロパティなどの情報を取得および操作できるようにする PHP の強力な機能です。再帰的反復構造は一般的な処理方法であり、複雑なデータ構造を横断して操作するのに役立ちます。リフレクション構造と再帰的反復構造を組み合わせることで、フィールドの値を簡単に取得および設定できるため、より柔軟で効率的なプログラミングが可能になります。次のコンテンツでは、読者がこのテクニックをよりよく理解し、適用できるように、このプロセスを詳細に紹介します。

質問内容

リフレクションを使用して構造体のフィールドを設定するプログラムを構築したいと考えています。最上位フィールドでは機能するようになりましたが、ネストされた構造体フィールドでは苦労しています。ネストされた構造体フィールドを反復するにはどうすればよいですか?

type Payload struct {
    Type    string   `json:"type"`
    SubItem *SubItem `json:"sub_item"`
}

type SubItem struct {
    Foo string `json:"foo"`
}

func main() {
    var payload Payload
    setValue(&payload, "type", "test1")
    setValue(&payload, "sub_item.foo", "test2")
}

func setValue(structPtr interface{}, key string, value string) {
    structValue := reflect.Indirect(reflect.ValueOf(structPtr))
    for i, subkey := range strings.Split(key, ".") {
        isLast := i == len(strings.Split(key, "."))-1
        var found bool
        // this line is crashing with "reflect: call of reflect.Value.NumField on zero Value"
        for i := 0; i < structValue.NumField(); i++ {
            field := structValue.Type().Field(i)
            jsonTags := strings.Split(field.Tag.Get("json"), ",")
            if jsonTags[0] == subkey {
                found = true
                if isLast {
                    if isLast {
                        // last element
                        // TODO set value
                        fmt.Printf("TODO set value %s to %v", value, structValue)
                        structValue = reflect.Indirect(reflect.ValueOf(structPtr))
                    }
                } else {
                    structValue = reflect.Indirect(reflect.ValueOf(structValue.Field(i).Interface()))
                }
                break
            }
        }
        if !found {
            panic(fmt.Errorf("failed to find field %s", key))
        }
    }
}

解決策

この機能を使用してください:

リーリー

関数 findjsonfield は、フィールドの json タグを通じて構造体フィールドを検索します:

リーリー

https://www.php.cn/link/e4848ea6b69df2c66c87e2877e74726b

以上がリフレクションを使用して構造を再帰的に反復し、フィールドを設定しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。