Go에서 복잡한 YAML 파일을 효과적으로 구문 분석하려면 어떻게 해야 하나요?

Susan Sarandon
풀어 주다: 2024-11-09 12:38:02
원래의
315명이 탐색했습니다.

How do I effectively parse complex YAML files in Go?

Go에서 YAML 파일 구문 분석

문제:

Go의 YAML 파일. 다음은 구문 분석하려는 샘플 YAML 파일입니다.

---
firewall_network_rules:
  rule1:
    src:       blablabla-host
    dst:       blabla-hostname
...
로그인 후 복사

해결책:

주어진 YAML 파일을 구문 분석하려면 다음과 같은 구조체를 생성해야 합니다. 구조를 정확하게 반영합니다. 귀하의 경우 YAML 파일에는 중첩된 요소가 포함되어 있으므로 구조체는 해당 중첩을 반영해야 합니다. 올바른 구조체 정의는 다음과 같습니다.

type FirewallNetworkRule struct {
    Src string `yaml:"src"`
    Dst string `yaml:"dst"`
}

type Config struct {
    FirewallNetworkRules map[string][]FirewallNetworkRule `yaml:"firewall_network_rules"`
}
로그인 후 복사

이제 YAML 파일을 Config 구조체로 역마샬링하려면 다음 코드를 사용하세요.

var config Config

err := yaml.Unmarshal(yamlFile, &config)
if err != nil {
    panic(err)
}

fmt.Printf("Value: %#v\n", config.FirewallNetworkRules)
로그인 후 복사

고급 예:

Kubernetes 또는 Google Cloud 서비스 YAML과 같은 복잡한 YAML 파일로 작업할 때 복잡한 데이터 구조를 나타내기 위해 구조체를 중첩해야 할 수도 있습니다. 예를 들어 다음 YAML은 Kubernetes 서비스를 정의합니다.

apiVersion: v1
kind: Service
metadata:
  name: myName
  namespace: default
  labels:
    router.deis.io/routable: "true"
  annotations:
    router.deis.io/domains: ""
spec:
  type: NodePort
  selector:
    app: myName
  ports:
    - name: http
      port: 80
      targetPort: 80
    - name: https
      port: 443
      targetPort: 443
로그인 후 복사

이 YAML에 해당하는 Go 구조체는 다음과 같습니다.

type Service struct {
    APIVersion string `yaml:"apiVersion"`
    Kind       string `yaml:"kind"`
    Metadata   struct {
        Name      string `yaml:"name"`
        Namespace string `yaml:"namespace"`
        Labels    struct {
            RouterDeisIoRoutable string `yaml:"router.deis.io/routable"`
        } `yaml:"labels"`
        Annotations struct {
            RouterDeisIoDomains string `yaml:"router.deis.io/domains"`
        } `yaml:"annotations"`
    } `yaml:"metadata"`
    Spec struct {
        Type     string `yaml:"type"`
        Selector struct {
            App string `yaml:"app"`
        } `yaml:"selector"`
        Ports []struct {
            Name       string `yaml:"name"`
            Port       int    `yaml:"port"`
            TargetPort int    `yaml:"targetPort"`
            NodePort   int    `yaml:"nodePort,omitempty"`
        } `yaml:"ports"`
    } `yaml:"spec"`
}
로그인 후 복사

YAML 파일을 이 구조체로 역마샬링하려면 다음을 사용합니다. 다음 코드:

var service Service

err := yaml.Unmarshal(yourFile, &service)
if err != nil {
    panic(err)
}

fmt.Print(service.Metadata.Name)
로그인 후 복사

위 내용은 Go에서 복잡한 YAML 파일을 효과적으로 구문 분석하려면 어떻게 해야 하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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