Go에서 YAML 필드를 유한 구조체 세트로 동적으로 구문 분석
YAML 파일 구문 분석은 많은 애플리케이션에서 일반적인 작업입니다. 그러나 때로는 YAML 파일에 다양한 유형의 구조체로 표시해야 하는 필드가 포함될 수 있습니다. 이로 인해 코드가 복잡해지고 YAML 파일이 복잡해질 수 있습니다.
예를 들어 다음 YAML 파일을 고려하세요.
<code class="yaml">kind: "foo" spec: fooVal: 4</code>
<code class="yaml">kind: "bar" spec: barVal: 5</code>
그리고 구문 분석을 위한 해당 구조체:
<code class="go">type Spec struct { Kind string `yaml:"kind"` Spec interface{} `yaml:"spec"` } type Foo struct { FooVal int `yaml:"fooVal"` } type Bar struct { BarVal int `yaml:"barVal"` }</code>
한 가지 접근 방식은 사양 필드의 유형으로 map[string]인터페이스{}를 사용하는 것입니다. 그러나 이 접근 방식은 특히 대규모 YAML 파일의 경우 추가적인 복잡성과 메모리 소비로 이어질 수 있습니다.
더 우아한 해결책은 yamlNode 구조체를 사용하는 것입니다.
<code class="go">type yamlNode struct { unmarshal func(interface{}) error } func (n *yamlNode) UnmarshalYAML(unmarshal func(interface{}) error) error { n.unmarshal = unmarshal return nil }</code>
Spec 구조체를 수정합니다. 사용 방법:
<code class="go">type Spec struct { Kind string `yaml:"kind"` Spec interface{} `yaml:"-" json:"-"` }</code>
이러한 변경 사항을 통해 Spec용 UnmarshalYAML 함수는 Spec 필드를 특정 구조체 유형으로 동적으로 구문 분석하고 역마샬링할 수 있습니다.
<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 필드를 유한한 구조체 세트로 동적으로 구문 분석하여 코드와 YAML 파일을 훨씬 더 깔끔하고 관리하기 쉽게 만드는 우아하고 효율적인 솔루션입니다.
위 내용은 Go에서 YAML 필드를 유한 구조체 세트로 동적으로 구문 분석하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!