0Pricing
Go Academy · Aula

Construção de uma API flexível

Aplique o padrão

Construção de uma API flexível é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.

Aplique o padrão

Agora monte o padrão completo: um construtor que recebe argumentos obrigatórios e uma lista variável de opções.

O construtor variável

Os parâmetros obrigatórios vêm primeiro; as opções vêm depois como ...Option.

package main

import "fmt"

type Server struct {
	Host string
	Port int
}
type Option func(*Server)

func WithPort(p int) Option { return func(s *Server) { s.Port = p } }

func NewServer(host string, opts ...Option) *Server {
	s := &Server{Host: host}
	for _, opt := range opts {
		opt(s)
	}
	return s
}

func main() {
	s := NewServer("localhost", WithPort(8080))
	fmt.Printf("%+v\n", *s)
}

Chamando sem opções

Como as opções são variáveis, os pontos de chamada podem omiti-las completamente e confiar no que o construtor configurar.

package main

import "fmt"

type Server struct{ Host string; Port int }
type Option func(*Server)

func NewServer(host string, opts ...Option) *Server {
	s := &Server{Host: host}
	for _, o := range opts { o(s) }
	return s
}

func main() {
	s := NewServer("localhost")
	fmt.Printf("%+v\n", *s)
}

Chamando com várias opções

Empilhe quantas opções quiser; cada uma fica clara no ponto de chamada.

package main

import "fmt"

type Server struct {
	Host    string
	Port    int
	Timeout int
	TLS     bool
}
type Option func(*Server)

func WithPort(p int) Option    { return func(s *Server) { s.Port = p } }
func WithTimeout(t int) Option { return func(s *Server) { s.Timeout = t } }
func WithTLS() Option          { return func(s *Server) { s.TLS = true } }

func NewServer(host string, opts ...Option) *Server {
	s := &Server{Host: host}
	for _, o := range opts { o(s) }
	return s
}

func main() {
	s := NewServer("localhost", WithPort(9000), WithTimeout(60), WithTLS())
	fmt.Printf("%+v\n", *s)
}

Chamadas autoexplicativas

Compare NewServer("localhost", WithPort(9000), WithTLS()) com uma chamada posicional. A intenção é óbvia sem consultar a assinatura.

Adicionando opções depois

Precisa de uma nova configuração? Adicione uma função WithX. Todos os pontos de chamada existentes continuarão compilando sem alterações — verdadeira compatibilidade retroativa.

package main

import "fmt"

type Server struct{ Host string; Retries int }
type Option func(*Server)

func WithRetries(n int) Option { return func(s *Server) { s.Retries = n } }

func NewServer(host string, opts ...Option) *Server {
	s := &Server{Host: host}
	for _, o := range opts { o(s) }
	return s
}

func main() {
	fmt.Printf("%+v\n", *NewServer("h", WithRetries(5)))
}

Passando opções adiante

Como as opções são valores, você pode criar uma fatia em outro lugar e encaminhá-la ao construtor.

package main

import "fmt"

type Server struct{ Host string; Port int }
type Option func(*Server)

func WithPort(p int) Option { return func(s *Server) { s.Port = p } }

func NewServer(host string, opts ...Option) *Server {
	s := &Server{Host: host}
	for _, o := range opts { o(s) }
	return s
}

func main() {
	common := []Option{WithPort(443)}
	s := NewServer("api", common...)
	fmt.Printf("%+v\n", *s)
}

Opções como uma API pública

Exporte o tipo Option e as funções WithX para que os usuários da biblioteca configurem seu tipo sem tocar em seus detalhes internos.

Mantendo os campos privados

Os campos de configuração podem continuar não exportados; as opções são a única forma autorizada de defini-los, protegendo as invariantes.

Onde o padrão se destaca

  • Construtores de bibliotecas com muitas configurações opcionais
  • APIs que precisam permanecer estáveis enquanto crescem
  • Clientes, servidores, registradores e criadores

Ecos da biblioteca padrão

Você verá esse estilo em todo o ecossistema Go, incluindo gRPC e muitos controladores. Reconhecê-lo fará essas APIs parecerem familiares.

Verificação rápida

Teste seus conhecimentos sobre APIs flexíveis.

Recapitulação

Você criou uma API flexível com opções funcionais.

  • Primeiro os argumentos obrigatórios, depois ...Option
  • Percorra as opções aplicando cada uma
  • Os pontos de chamada podem passar zero ou muitas opções, com leitura clara
  • Adicione opções depois sem quebrar os pontos de chamada

Perguntas Frequentes

A aula “Construção de uma API flexível” é grátis?

Sim — o texto completo de “Construção de uma API flexível” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.

O que vou aprender em “Construção de uma API flexível”?

Aplique o padrão Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Go Academy?

Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Construção de uma API flexível”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Go Academy?

Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O problema de muitos parâmetros
  2. Funções de opções
  3. Construção de uma API flexível
  4. Padrões e validação
← Voltar para Go Academy