Go에서는 여러 가지 방법으로 맵을 구조체로 변환할 수 있습니다. 한 가지 접근 방식은 맵을 구조체로 효율적으로 디코딩하는 mapstructure 패키지를 사용하는 것입니다. 그러나 보다 직접적인 방법을 찾는 사람들을 위해 다음은 사용자 정의 구현입니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!