在Go 中將映射轉換為結構體:高效方法
用Go 中的映射資料填充結構體可能是一項常見任務,並且使用中間JSON 轉換可能會讓人感覺效率低下。幸運的是,有更有效的方法來完成這種轉換。
強烈推薦的一種方法是利用 Mitchell Hashimoto 的多功能「mapstruct」套件。有了這個包,你可以簡單地調用:
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) }
此程式碼將精心處理欄位查找、類型檢查和值分配實作map到struct的轉換。
以上是如何在 Go 中有效率地將 Map 轉換為結構體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!