Значения по умолчанию и проверка
Задавайте разумные значения по умолчанию
«Значения по умолчанию и проверка» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Проблема большого числа параметров
- Функции параметров
- Создание гибкого API
- Значения по умолчанию и проверка