0Pricing
Go Academy · Урок

Значения по умолчанию и проверка

Задавайте разумные значения по умолчанию

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

Задавайте разумные значения по умолчанию

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

Инициализируйте перед применением

Сначала создайте конфигурацию со значениями по умолчанию, а затем примените к ней опции.

package main

import "fmt"

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

func WithPort(p int) Option { return func(s *Server) { s.Port = p } }

func NewServer(opts ...Option) *Server {
	s := &Server{Port: 8080, Timeout: 30}
	for _, o := range opts { o(s) }
	return s
}

func main() {
	fmt.Printf("%+v\n", *NewServer())
	fmt.Printf("%+v\n", *NewServer(WithPort(9000)))
}

Значения по умолчанию действуют до переопределения

Вызов без опций использует значения по умолчанию, а опция заменяет только изменяемое ею поле. Так Вы получаете лучшее из обоих подходов.

Проверка после применения

После применения опций проверьте итоговую конфигурацию и верните ошибку, если она недействительна. Пусть конструктор возвращает (*T, error).

package main

import (
	"errors"
	"fmt"
)

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

func WithPort(p int) Option { return func(s *Server) { s.Port = p } }

func NewServer(opts ...Option) (*Server, error) {
	s := &Server{Port: 8080}
	for _, o := range opts { o(s) }
	if s.Port < 1 || s.Port > 65535 {
		return nil, errors.New("invalid port")
	}
	return s, nil
}

func main() {
	_, err := NewServer(WithPort(99999))
	fmt.Println(err)
}

Проверка внутри опций

Другой вариант — сами опции могут возвращать ошибку. Тогда тип Option становится func(*Config) error.

package main

import (
	"errors"
	"fmt"
)

type Server struct{ Port int }
type Option func(*Server) error

func WithPort(p int) Option {
	return func(s *Server) error {
		if p < 1 {
			return errors.New("port must be positive")
		}
		s.Port = p
		return nil
	}
}

func NewServer(opts ...Option) (*Server, error) {
	s := &Server{Port: 8080}
	for _, o := range opts {
		if err := o(s); err != nil {
			return nil, err
		}
	}
	return s, nil
}

func main() {
	_, err := NewServer(WithPort(-1))
	fmt.Println(err)
}

Какой стиль проверки выбрать

Проверяйте значения внутри опций, если нужны проверки отдельных параметров; проверяйте после применения опций, если нужны правила для взаимосвязанных полей (например, TLS требует указать путь к сертификату). Часто используются оба подхода.

Документирование значений по умолчанию

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

Обязательные и необязательные значения

Оставляйте действительно обязательные значения позиционными параметрами, а опции используйте только для действительно необязательных. Не скрывайте обязательные данные за опцией.

package main

import "fmt"

type Client struct {
	BaseURL string
	Retries int
}
type Option func(*Client)

func WithRetries(n int) Option { return func(c *Client) { c.Retries = n } }

func NewClient(baseURL string, opts ...Option) *Client {
	c := &Client{BaseURL: baseURL, Retries: 3}
	for _, o := range opts { o(c) }
	return c
}

func main() {
	fmt.Printf("%+v\n", *NewClient("https://api"))
}

Объединение опций

Вы можете объединить несколько опций в одну готовую конфигурацию для распространённых случаев.

package main

import "fmt"

type Server struct{ Port, Timeout int }
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 Production() Option {
	return func(s *Server) {
		WithPort(443)(s)
		WithTimeout(60)(s)
	}
}

func NewServer(opts ...Option) *Server {
	s := &Server{Port: 8080, Timeout: 30}
	for _, o := range opts { o(s) }
	return s
}

func main() {
	fmt.Printf("%+v\n", *NewServer(Production()))
}

Лучшие практики

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

Полный надёжный программный интерфейс

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

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

Проверьте свои знания значений по умолчанию и проверки.

Итоги

Вы завершили изучение шаблона функциональных опций.

  • Устанавливайте значения по умолчанию до применения опций
  • Проверяйте после применения или внутри опций для проверки отдельных полей
  • Оставляйте обязательные значения позиционными
  • Объединяйте опции в готовые конфигурации и документируйте значения по умолчанию

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

Урок «Значения по умолчанию и проверка» бесплатный?

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

Чему я научусь в уроке «Значения по умолчанию и проверка»?

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

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

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

Сколько времени занимает урок «Значения по умолчанию и проверка»?

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

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

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

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

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