ホームページ  >  記事  >  バックエンド開発  >  Go で複雑な YAML ファイルを効果的に解析するにはどうすればよいですか?

Go で複雑な YAML ファイルを効果的に解析するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-09 12:38:02317ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。