Go에서 YAML 필드를 특정 구조체로 동적으로 구문 분석하려면 어떻게 해야 합니까?

Susan Sarandon
풀어 주다: 2024-10-31 03:50:01
원래의
692명이 탐색했습니다.

How Can I Dynamically Parse a YAML Field to Specific Structs in Go?

Go에서 미리 정의된 구조체로 YAML 필드를 동적으로 구문 분석

특정 필드가 미리 정의된 구조체 집합의 값으로 표현될 수 있는 YAML 파일의 경우 적합한 접근 방식은 YAML 패키지의 UnmarshalYAML 메서드를 활용하는 것입니다. 이를 통해 특정 유형에 대한 사용자 정의 역마샬링 논리를 생성할 수 있습니다.

YAML v2

YAML v2를 사용하여 다음 코드는 원하는 동작을 달성합니다.

<code class="go">type yamlNode struct {
    unmarshal func(interface{}) error
}

func (n *yamlNode) UnmarshalYAML(unmarshal func(interface{}) error) error {
    n.unmarshal = unmarshal
    return nil
}

type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-"`
}</code>
로그인 후 복사
<code class="go">func (s *Spec) UnmarshalYAML(unmarshal func(interface{}) error) error {
    type S Spec
    type T struct {
        S    `yaml:",inline"`
        Spec yamlNode `yaml:"spec"`
    }

    obj := &T{}
    if err := unmarshal(obj); err != nil {
        return err
    }
    *s = Spec(obj.S)

    switch s.Kind {
    case "foo":
        s.Spec = new(Foo)
    case "bar":
        s.Spec = new(Bar)
    default:
        panic("kind unknown")
    }
    return obj.Spec.unmarshal(s.Spec)
}</code>
로그인 후 복사

YAML v3

YAML v3의 경우 다음 코드를 사용하세요.

<code class="go">type Spec struct {
    Kind string      `yaml:"kind"`
    Spec interface{} `yaml:"-"`
}</code>
로그인 후 복사
<code class="go">func (s *Spec) UnmarshalYAML(n *yaml.Node) error {
    type S Spec
    type T struct {
        *S   `yaml:",inline"`
        Spec yaml.Node `yaml:"spec"`
    }

    obj := &T{S: (*S)(s)}
    if err := n.Decode(obj); err != nil {
        return err
    }

    switch s.Kind {
    case "foo":
        s.Spec = new(Foo)
    case "bar":
        s.Spec = new(Bar)
    default:
        panic("kind unknown")
    }
    return obj.Spec.Decode(s.Spec)
}</code>
로그인 후 복사

이 접근 방식은 YAML 데이터를 사전 정의된 구조체 세트로 역마샬링하는 간단하고 우아한 방법을 제공합니다. 추가 구문 분석 단계 또는 과도한 메모리 소비.

위 내용은 Go에서 YAML 필드를 특정 구조체로 동적으로 구문 분석하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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