Golang での構造体プロパティへの動的アクセス
Go で構造体のプロパティに動的にアクセスして更新する必要が生じる場合があります。これは、実行時のリフレクションと型と値の操作を可能にする、reflect パッケージを使用して実現できます。
構造体のフィールドを名前で設定するには、reflect パッケージを利用してフィールドの値を取得し、新しい値を割り当てます。この機能を実装する関数は次のとおりです。
// setField sets field of v with given name to given value. func setField(v interface{}, name string, value string) error { // v must be a pointer to a struct rv := reflect.ValueOf(v) if rv.Kind() != reflect.Ptr || rv.Elem().Kind() != reflect.Struct { return errors.New("v must be pointer to struct") } // Dereference pointer rv = rv.Elem() // Lookup field by name fv := rv.FieldByName(name) if !fv.IsValid() { return fmt.Errorf("not a field name: %s", name) } // Field must be exported if !fv.CanSet() { return fmt.Errorf("cannot set field %s", name) } // We expect a string field if fv.Kind() != reflect.String { return fmt.Errorf("%s is not a string field", name) } // Set the value fv.SetString(value) return nil }
この関数を使用するには、次のように呼び出します。
var config SshConfig ... err := setField(&config, split[0], strings.Join(split[1:], " ")) if err != nil { // handle error }
このアプローチにより、構造体の値を動的に設定できます。明示的な if-else ステートメントや switch case を必要としないフィールド。
以上がGo で構造体のプロパティに動的にアクセスして更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。