Go에서 동적 키를 사용하여 YAML 구문 분석
이 문제는 사용자가 정의한 API 버전에 따라 달라질 수 있는 키를 사용하여 YAML 파일을 구문 분석할 때 발생합니다. . 사용자는 필요에 따라 버전을 생략하거나 배열할 수 있습니다(예: V0, V2, V5).
환경 구조를 사용한 원래 접근 방식
초기 접근 방식에는 YAML을 다음과 같이 구문 분석하는 것이 포함됩니다. 환경 구조체. 그러나 구문 분석된 데이터의 실제 유형은 map[string]Environment입니다.
<code class="go">type Environment struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` Version map[string]MajorVersion }</code>
이 문제를 해결하려면 사용자 정의 Unmarshaler가 필요합니다.
Custom Unmarshaler for Environment
정적 키와 동적 키를 모두 구문 분석하는 환경 유형에 대한 사용자 정의 Unmarshaler 메서드를 생성합니다.
<code class="go">func (e *Environment) UnmarshalYAML(unmarshal func(interface{}) error) error { var params struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` } if err := unmarshal(&params); err != nil { return err } var versions map[string]MajorVersion if err := unmarshal(&versions); err != nil { // Expect error here due to boolean to MajorVersion conversion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil }</code>
수정된 구문 분석 및 출력
이제 구문 분석 코드를 수정하여 동적 키를 처리하고 궁극적으로 원하는 데이터 구조를 반환할 수 있습니다.
수정된 기본 함수
<code class="go">func main() { var e map[string]Environment if err := yaml.Unmarshal([]byte(data), &e); err != nil { fmt.Println(err.Error()) } fmt.Printf("%#v\n", e) }</code>
출력
이제 출력에는 그에 따라 구문 분석된 동적 키가 포함된 예상 데이터 구조가 반영됩니다.
map[string]main.Environment{ "development": { SkipHeaderValidation: true, Versions: { "V2": { Current: "2.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: false, SkipMimeTypeValidation: false, }, "V1": { Current: "1.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: true, SkipMimeTypeValidation: true, }, }, }, }
위 내용은 사용자 정의 언마샬러를 사용하여 Go에서 동적 키로 YAML을 구문 분석하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!