> 백엔드 개발 > Golang > 외부 라이브러리 없이 Go 맵을 구조체로 직접 변환하려면 어떻게 해야 합니까?

외부 라이브러리 없이 Go 맵을 구조체로 직접 변환하려면 어떻게 해야 합니까?

Patricia Arquette
풀어 주다: 2024-12-27 21:58:13
원래의
345명이 탐색했습니다.

How Can I Directly Convert a Go Map to a Struct Without External Libraries?

중개자 없이 Go에서 맵을 구조체로 변환

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿