Trabalhando com YAML em Go (Golang) — bibliotecas gopkg.in/yaml.v3 e encoding/json

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalhando com YAML em Go (Golang) — biblioteca gopkg.in/yaml.v3



YAML (YAML Ain't Markup Language) é um formato popular de serialização de dados, frequentemente usado para arquivos de configuração, descrição de APIs (OpenAPI/Swagger), pipelines de CI/CD (GitLab CI, GitHub Actions) e Docker Compose. No ecossistema Go (Golang), não há uma biblioteca padrão para trabalhar com YAML, então os desenvolvedores usam a poderosa e estável biblioteca de terceiros gopkg.in/yaml.v3. Neste artigo, vamos detalhar como ler, escrever e processar YAML em Go.



Instalação da biblioteca

Para começar, adicione o pacote ao seu projeto:

go get gopkg.in/yaml.v3

Depois, importe-o no código:

import "gopkg.in/yaml.v3"


Estruturas principais para trabalhar com YAML

A biblioteca yaml.v3 suporta:

  • Marshaling (Marshal) — conversão de estruturas Go em string YAML.
  • Unmarshaling (Unmarshal) — parsing de string YAML para estrutura Go.
  • Parsing de fluxo (Decoder/Encoder) para trabalhar com arquivos.
  • Tags yaml:"fieldname" para configurar nomes de campos.


Exemplo 1: Lendo YAML de uma string

O caso mais simples é analisar uma string YAML em uma estrutura Go:

package main

import ( "fmt" "gopkg.in/yaml.v3")

type Config struct { Server struct { Port int `yaml:"port"` Host string `yaml:"host"` } `yaml:"server"` Database struct { User string `yaml:"user"` Pass string `yaml:"pass"` } `yaml:"database"`}

func main() { yamlData := `server: port: 8080 host: "localhost"database: user: "admin" pass: "secret"` var cfg Config err := yaml.Unmarshal([]byte(yamlData), &cfg) if err != nil { panic(err) } fmt.Printf("Servidor: %s:%d", cfg.Server.Host, cfg.Server.Port) fmt.Printf("Banco: %s", cfg.Database.User)}


Exemplo 2: Escrevendo YAML em um arquivo

Para escrever dados em um arquivo YAML, use yaml.Marshal e escreva no sistema de arquivos:

package main

import ( "os" "gopkg.in/yaml.v3")

type AppConfig struct { Name string `yaml:"name"` Version string `yaml:"version"` Debug bool `yaml:"debug"`}

func main() { config := AppConfig{ Name: "MyApp", Version: "1.0.0", Debug: true, }

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

err = os.WriteFile("config.yaml", data, 0644) if err != nil { panic(err) } println("Arquivo config.yaml criado")}


Exemplo 3: Trabalhando com estruturas aninhadas e complexas

YAML suporta listas, estruturas map e aninhamento profundo. Aqui está um exemplo de parsing de uma lista de servidores:

package main

import ( "fmt" "gopkg.in/yaml.v3")

type Service struct { Name string `yaml:"name"` Ports []int `yaml:"ports"` Enabled bool `yaml:"enabled"`}

type Deployment struct { Version string `yaml:"version"` Services []Service `yaml:"services"`}

func main() { input := `version: "2.1"services: - name: web ports: [80, 443] enabled: true - name: api ports: [3000] enabled: false` var dep Deployment if err := yaml.Unmarshal([]byte(input), &dep); err != nil { panic(err) }

for _, s := range dep.Services { fmt.Printf("Serviço %s: portas %v, ativo: %t", s.Name, s.Ports, s.Enabled) }}


Leitura e escrita de fluxo (Decoder/Encoder)

Para trabalhar com arquivos grandes ou fluxos de dados, use yaml.Decoder e yaml.Encoder:

package main

import ( "

Recommendations