Go에서 YAML 필드를 유한 구조체 세트로 동적으로 구문 분석하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-30 23:11:30
원래의
273명이 탐색했습니다.

How to Dynamically Parse a YAML Field into a Finite Set of Structs in Go?

Go에서 YAML 필드를 유한 구조체 세트로 동적으로 구문 분석

소개

Go에서 YAML을 구조체로 구문 분석하는 것은 간단할 수 있습니다. 그러나 YAML 필드가 가능한 여러 구조체를 나타낼 수 있으면 작업이 더 복잡해집니다. 이 기사에서는 Go의 YAML 패키지를 사용하는 동적 접근 방식을 살펴봅니다.

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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿