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
- O problema de muitos parâmetros
- Funções de opções
- Construção de uma API flexível
- Padrões e validação