Creare un'API flessibile
Applicare il pattern
Creare un'API flessibile è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.
Applicare il pattern
Ora assembli il pattern completo: un costruttore che accetta gli argomenti obbligatori più un elenco variadico di opzioni.
Il costruttore variadico
I parametri obbligatori vengono prima; le opzioni seguono come ...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)
}Chiamare senza opzioni
Poiché le opzioni sono variadiche, i chiamanti possono ometterle completamente e affidarsi a ciò che il costruttore configura.
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)
}Chiamare con più opzioni
Passi tutte le opzioni desiderate; ciascuna è facilmente comprensibile nel punto di chiamata.
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)
}Chiamate autoesplicative
Confronti NewServer("localhost", WithPort(9000), WithTLS()) con una chiamata posizionale. L'intento è evidente senza controllare la firma.
Aggiungere opzioni in seguito
Ha bisogno di una nuova impostazione? Aggiunga una funzione WithX. Ogni punto di chiamata esistente continuerà a essere compilato senza modifiche: vera compatibilità con le versioni precedenti.
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)))
}Passare le opzioni
Poiché le opzioni sono valori, può costruire uno slice altrove e passarlo al costruttore.
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)
}Le opzioni come API pubblica
Esporti il tipo Option e le funzioni WithX, così gli utenti della libreria possono configurare il suo tipo senza toccarne gli elementi interni.
Mantenere privati i campi
I campi della configurazione possono rimanere non esportati; le opzioni sono l'unico modo autorizzato per impostarli e proteggono gli invarianti.
Dove il pattern dà il meglio
- Costruttori di librerie con molte impostazioni opzionali
- API che devono rimanere stabili mentre crescono
- Client, server, logger e builder
Echi nella libreria standard
Vedrà questo stile in tutto l'ecosistema Go, ad esempio in gRPC e in molti driver. Riconoscerlo rende familiari queste API.
Verifica rapida
Verifichi la sua conoscenza delle API flessibili.
Riepilogo
Ha costruito un'API flessibile con le opzioni funzionali.
- Prima gli argomenti obbligatori, poi
...Option - Iteri sulle opzioni applicandole una alla volta
- I chiamanti ne passano zero o molte, in modo chiaro
- Aggiunga opzioni in seguito senza interrompere i chiamanti
Domande Frequenti
La lezione «Creare un'API flessibile» è gratuita?
Sì — il testo completo di «Creare un'API flessibile» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.
Cosa imparerò in «Creare un'API flessibile»?
Applicare il pattern Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Go Academy?
Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Creare un'API flessibile»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Go Academy?
Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Il problema dei molti parametri
- Funzioni opzione
- Creare un'API flessibile
- Valori predefiniti e validazione