Go では、マップから構造体への変換はいくつかの方法で実現できます。 1 つのアプローチには、マップを構造体に効率的にデコードできるマップ構造パッケージの使用が含まれます。ただし、より直接的な方法を求める人のために、カスタム実装を次に示します。
import "reflect" type MyStruct struct { Name string Age int64 } // SetField sets the value of a struct field by name. func SetField(obj interface{}, name string, value interface{}) error { structValue := reflect.ValueOf(obj).Elem() field := structValue.FieldByName(name) if !field.IsValid() { return fmt.Errorf("No such field: %s in obj", name) } if !field.CanSet() { return fmt.Errorf("Cannot set %s field value", name) } val := reflect.ValueOf(value) if field.Type() != val.Type() { return errors.New("Provided value type didn't match obj field type") } field.Set(val) return nil } // FillStruct fills the struct fields with values from the map. func (s *MyStruct) FillStruct(m map[string]interface{}) error { for k, v := range m { err := SetField(s, k, v) if err != nil { return err } } return nil } func main() { data := make(map[string]interface{}) data["Name"] = "Tony" data["Age"] = int64(23) result := &MyStruct{} err := result.FillStruct(data) if err != nil { fmt.Println(err) } fmt.Println(result) }
このアプローチでは、SetField 関数はフィールドの値を名前で設定し、フィールドが存在し、アクセス可能であることを確認します。正しいタイプを持っています。次に、構造体の FillStruct メソッドがマップを反復処理し、SetField を使用してフィールドに値を設定します。
以上が外部ライブラリを使用せずに Go マップを構造体に直接変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。