Go でのマップから構造体への変換: 効率的なアプローチ
Go でマップのデータを構造体に埋めるのは一般的なタスクであり、中間的な JSON 変換は非効率的に感じられる場合があります。幸いなことに、この変換を達成するためのより効率的な方法があります。
強く推奨されるアプローチの 1 つは、Mitchell Holdings の汎用性の高い「マップ構造」パッケージを活用することです。このパッケージを使用すると、次のコマンドを簡単に呼び出すことができます。
import "github.com/mitchellh/mapstructure" mapstructure.Decode(myData, &result)
このエレガントな構文は、最小限の労力でマップ myData を構造体の結果にデコードします。
より DIY のアプローチを好む場合は、次のようにすることもできます。以下のコード スニペットに概説されている包括的なソリューションに従ってください:
func SetField(obj interface{}, name string, value interface{}) error { // Get a handle on the struct value and field structValue := reflect.ValueOf(obj).Elem() structFieldValue := structValue.FieldByName(name) // Check validity and permissions for the operation if !structFieldValue.IsValid() { return fmt.Errorf("No such field: %s in obj", name) } if !structFieldValue.CanSet() { return fmt.Errorf("Cannot set %s field value", name) } // Match field types for assignment structFieldType := structFieldValue.Type() val := reflect.ValueOf(value) if structFieldType != val.Type() { return errors.New("Provided value type didn't match obj field type") } // Update the field value within the struct instance structFieldValue.Set(val) return nil } type MyStruct struct { Name string Age int64 } func (s *MyStruct) FillStruct(m map[string]interface{}) error { // Iterate over map keys and values, setting corresponding struct fields for k, v := range m { err := SetField(s, k, v) if err != nil { return err } } return nil } func main() { myData := make(map[string]interface{}) myData["Name"] = "Tony" myData["Age"] = int64(23) result := &MyStruct{} err := result.FillStruct(myData) if err != nil { fmt.Println(err) } fmt.Println(result) }
このコードはフィールドを細心の注意を払って処理します。マップから構造体への変換を実現するための検索、型チェック、および値の割り当て。
以上がGo でマップを構造体に効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。