0Pricing
Go Academy · Урок

Функции параметров

Настраивайте с помощью функций

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

Настройка с помощью функций

Основная идея такова: представить каждый необязательный параметр как функцию, изменяющую конфигурацию. Это и есть «функции опций».

Тип опции

Определите Option как функцию, принимающую указатель на структуру конфигурации.

package main

import "fmt"

type Config struct {
	Port    int
	Timeout int
}

type Option func(*Config)

func main() {
	var o Option
	fmt.Println(o == nil)
}

Создание опции

Опция возвращает замыкание, которое устанавливает одно поле. WithPort(9000) создаёт функцию, присваивающую Port = 9000.

package main

import "fmt"

type Config struct{ Port int }
type Option func(*Config)

func WithPort(p int) Option {
	return func(c *Config) { c.Port = p }
}

func main() {
	c := &Config{}
	WithPort(9000)(c)
	fmt.Println(c.Port)
}

Замыкания захватывают значение

Возвращаемая функция замыкает аргумент. WithPort(9000) запоминает значение 9000 до момента применения.

Несколько опций

Для каждого параметра создаётся собственная функция опции. Все они используют один тип Option.

package main

import "fmt"

type Config struct {
	Port    int
	Timeout int
}
type Option func(*Config)

func WithPort(p int) Option    { return func(c *Config) { c.Port = p } }
func WithTimeout(t int) Option { return func(c *Config) { c.Timeout = t } }

func main() {
	c := &Config{}
	WithPort(80)(c)
	WithTimeout(15)(c)
	fmt.Printf("%+v\n", *c)
}

Опции с логическим флагом

Опция без параметров может переключать флаг.

package main

import "fmt"

type Config struct{ TLS bool }
type Option func(*Config)

func WithTLS() Option { return func(c *Config) { c.TLS = true } }

func main() {
	c := &Config{}
	WithTLS()(c)
	fmt.Println(c.TLS)
}

Применение среза опций

Соберите опции в срез и примените каждую в цикле — это основа конструктора, который Вы создадите далее.

package main

import "fmt"

type Config struct{ Port, Timeout int }
type Option func(*Config)

func WithPort(p int) Option    { return func(c *Config) { c.Port = p } }
func WithTimeout(t int) Option { return func(c *Config) { c.Timeout = t } }

func main() {
	c := &Config{}
	opts := []Option{WithPort(8080), WithTimeout(30)}
	for _, opt := range opts {
		opt(c)
	}
	fmt.Printf("%+v\n", *c)
}

Порядок имеет значение

Опции применяются по порядку. Если две опции устанавливают одно поле, побеждает последняя — иногда это полезно, а иногда становится источником ошибок, который следует документировать.

Соглашение об именовании

По соглашению конструкторы опций называются With... (например, WithPort, WithTLS), поэтому места вызова читаются понятно.

Опции могут содержать логику

Опция — это всего лишь функция, поэтому она может проверять, вычислять или объединять значения, а не только присваивать их.

Почему здесь функции лучше структур

  • Устанавливаются только указанные поля
  • Понятные названия видны прямо в месте вызова
  • Новые опции можно добавлять, не ломая вызывающий код

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

Проверьте свои знания функций опций.

Итоги

Вы научились создавать функции опций.

  • Определяйте type Option func(*Config)
  • Конструкторы WithX возвращают замыкания, изменяющие конфигурацию
  • Применяйте срез опций в цикле
  • Порядок имеет значение: последняя запись имеет приоритет

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

Урок «Функции параметров» бесплатный?

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

Чему я научусь в уроке «Функции параметров»?

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

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

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

Сколько времени занимает урок «Функции параметров»?

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

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

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

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

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