0Pricing
Go Academy · Урок

Создание гибкого API

Применяйте этот паттерн

«Создание гибкого API» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Применение шаблона

Теперь соберите полный шаблон: конструктор, принимающий обязательные аргументы и переменное число опций.

Вариадический конструктор

Сначала идут обязательные параметры, затем опции в виде ...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)
}

Вызов без опций

Поскольку опции имеют переменное число аргументов, вызывающий код может полностью их опустить и положиться на настройки конструктора.

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)
}

Вызов с несколькими опциями

Передавайте сколько угодно опций — каждая из них ясно читается в месте вызова.

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)
}

Понятные без пояснений вызовы

Сравните NewServer("localhost", WithPort(9000), WithTLS()) с вызовом с позиционными аргументами. Намерение очевидно, даже если не проверять сигнатуру.

Добавление опций позже

Нужен новый параметр? Добавьте функцию WithX. Все существующие места вызова продолжат компилироваться без изменений — настоящая обратная совместимость.

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)))
}

Передача опций

Поскольку опции являются значениями, Вы можете создать срез в другом месте и передать его дальше в конструктор.

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)
}

Опции как открытый программный интерфейс

Экспортируйте тип Option и функции WithX, чтобы пользователи библиотеки могли настраивать Ваш тип, не обращаясь к его внутренней реализации.

Сокрытие полей

Поля конфигурации могут оставаться неэкспортируемыми; опции будут единственным разрешённым способом их устанавливать, что защищает инварианты.

Где этот шаблон особенно полезен

  • Конструкторы библиотек с множеством необязательных параметров настройки
  • Программные интерфейсы, которые должны оставаться стабильными по мере развития
  • Клиенты, серверы, средства журналирования и построители

Аналоги в стандартной библиотеке

Вы встретите этот стиль во всей экосистеме Go (gRPC и многие драйверы). Если Вы его узнаёте, такие программные интерфейсы кажутся знакомыми.

Быстрая проверка

Проверьте свои знания гибких программных интерфейсов.

Итоги

Вы создали гибкий программный интерфейс с функциональными опциями.

  • Сначала обязательные аргументы, затем ...Option
  • Перебирайте опции в цикле и применяйте каждую
  • Вызывающий код может передать ноль или множество опций, сохраняя понятность
  • Добавляйте опции позже, не ломая вызывающий код

Часто задаваемые вопросы

Урок «Создание гибкого API» бесплатный?

Да — полный текст урока «Создание гибкого API» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Создание гибкого API»?

Применяйте этот паттерн Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Создание гибкого API»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проблема большого числа параметров
  2. Функции параметров
  3. Создание гибкого API
  4. Значения по умолчанию и проверка
← Назад к Go Academy