Golang で構造体をマップに変換する関数
質問:
どうすればよいですかJSON タグをキーとして利用して、Golang で構造体をマップに効率的に変換します。可能ですか?
答え:
サードパーティ ライブラリ:
Fatih による structs パッケージこれに対する単純かつ包括的なソリューションを提供しますタスク:
func Map(object interface{}) map[string]interface{}
使用法:
package main import ( "fmt" "github.com/fatih/structs" ) type Server struct { Name string `json:"name"` ID int32 `json:"id"` Enabled bool `json:"enabled"` } func main() { s := &Server{ Name: "gopher", ID: 123456, Enabled: true, } m := structs.Map(s) fmt.Println(m) // Output: {"name":"gopher", "id":123456, "enabled":true} }
機能:
カスタム実装:
カスタム実装が優先される場合は、reflect.Struct を利用できます。 :
func ConvertToMap(model interface{}) map[string]interface{} { // Get the reflect type and value of the model modelType := reflect.TypeOf(model) modelValue := reflect.ValueOf(model) if modelValue.Kind() == reflect.Ptr { modelValue = modelValue.Elem() } // Check if the model is a struct if modelType.Kind() != reflect.Struct { return nil } // Create a new map to store the key-value pairs ret := make(map[string]interface{}) // Iterate over the fields of the struct for i := 0; i < modelType.NumField(); i++ { // Get the field and its name field := modelType.Field(i) fieldName := field.Name // Check if the field has a JSON tag jsonTag := field.Tag.Get("json") if jsonTag != "" { fieldName = jsonTag } // Get the value of the field fieldValue := modelValue.Field(i) // Recursively convert nested structs switch fieldValue.Kind() { case reflect.Struct: ret[fieldName] = ConvertToMap(fieldValue.Interface()) default: ret[fieldName] = fieldValue.Interface() } } return ret }
ただし、これにはフィールド名を手動で抽出して変換する必要がありますネストされた構造体。
以上がJSON タグを使用して Go 構造体をマップに効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。