Budowanie elastycznego API
Zastosuj ten wzorzec
Budowanie elastycznego API to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.
Zastosowanie wzorca
Teraz złożysz cały wzorzec: konstruktor, który przyjmuje wymagane argumenty oraz zmienną liczbę opcji.
Konstruktor o zmiennej liczbie argumentów
Wymagane parametry umieść na początku, a opcje przekaż później jako ...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)
}Wywołanie bez opcji
Ponieważ opcje mają zmienną liczbę, można całkowicie je pominąć i skorzystać z konfiguracji przygotowanej przez konstruktor.
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)
}Wywołanie z wieloma opcjami
Możesz podać dowolną liczbę opcji; każda z nich jest czytelna w miejscu wywołania.
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)
}Samodokumentujące się wywołania
Porównaj NewServer("localhost", WithPort(9000), WithTLS()) z wywołaniem używającym argumentów pozycyjnych. Intencja jest oczywista, bez sprawdzania sygnatury.
Dodawanie opcji w przyszłości
Potrzebujesz nowego ustawienia? Dodaj funkcję WithX. Wszystkie istniejące miejsca wywołania nadal się kompilują bez zmian — to prawdziwa zgodność wsteczna.
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)))
}Przekazywanie opcji
Ponieważ opcje są wartościami, można utworzyć wycinek w innym miejscu i przekazać go dalej do konstruktora.
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)
}Opcje jako publiczne API
Eksportuj typ Option oraz funkcje WithX, aby użytkownicy biblioteki mogli konfigurować typ bez uzyskiwania dostępu do jego elementów wewnętrznych.
Ukrywanie pól
Pola konfiguracji mogą pozostać nieeksportowane; opcje są jedynym zatwierdzonym sposobem ich ustawiania, co chroni niezmienniki.
Kiedy wzorzec sprawdza się najlepiej
- Konstruktory bibliotek z wieloma opcjonalnymi ustawieniami
- API, które musi pozostać stabilne w miarę rozwoju
- Klienci, serwery, loggery i buildery
Odpowiedniki w bibliotece standardowej
Ten styl można spotkać w całym ekosystemie Go (gRPC i wielu sterownikach). Rozpoznawanie go sprawia, że te interfejsy API stają się znajome.
Szybkie sprawdzenie
Sprawdź swoją wiedzę o elastycznych interfejsach API.
Podsumowanie
Zbudowałeś elastyczne API z użyciem opcji funkcyjnych.
- Najpierw wymagane argumenty, a następnie
...Option - Iterowanie po opcjach i stosowanie każdej z nich
- Wywołujący mogą przekazać zero lub wiele opcji, a kod pozostaje czytelny
- Dodawanie opcji w przyszłości bez psucia istniejących wywołań
Często zadawane pytania
Czy lekcja „Budowanie elastycznego API” jest bezpłatna?
Tak — pełny tekst „Budowanie elastycznego API” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Budowanie elastycznego API”?
Zastosuj ten wzorzec Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Go Academy?
Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Budowanie elastycznego API”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?
Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Problem z wieloma parametrami
- Funkcje opcji
- Budowanie elastycznego API
- Wartości domyślne i walidacja