Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menukar Peta kepada Struktur dengan Cekap dalam Go?
Menukar Peta kepada Struktur dalam Go: Pendekatan Cekap
Mengisi struct dengan data daripada peta dalam Go boleh menjadi tugas biasa dan menggunakan penukaran JSON perantara boleh berasa tidak cekap. Nasib baik, terdapat cara yang lebih cekap untuk mencapai transformasi ini.
Satu pendekatan yang sangat disyorkan ialah memanfaatkan pakej "struktur peta" serba boleh daripada Mitchell Hashimoto. Dengan pakej ini, anda hanya boleh menggunakan:
import "github.com/mitchellh/mapstructure" mapstructure.Decode(myData, &result)
Sintaks elegan ini akan menyahkod peta myData ke dalam hasil struct dengan kekecohan yang minimum.
Jika anda lebih suka pendekatan DIY, anda boleh ikut penyelesaian komprehensif yang digariskan dalam coretan kod di bawah:
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) }
Kod ini akan mengendalikan medan dengan teliti carian, semakan taip dan penetapan nilai untuk mencapai penukaran daripada peta kepada struktur.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Peta kepada Struktur dengan Cekap dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!