Documentation
¶
Overview ¶
Package option — величина, которой может НЕ БЫТЬ, причём отдельно от того, какое значение она принимает, когда есть.
Зачем это, если есть нулевое значение ¶
Затем, что нулевое значение бывает ЗАКОННЫМ. Имя ресурса — пример из собственных конвенций: пустая строка есть законный вход создания (`api-conventions.md` §«Имя ресурса»), поэтому «имя не прислали» и «прислали пустое» — разные события с разными исходами, и различить их нулевым значением нельзя by construction. То же у необязательной ссылки: «не задавали» против «сняли».
Указатель решал бы ту же задачу и приносил бы вторую — разыменование nil, — а также делал бы структуру нестабильной по значению: две одинаковые записи перестали бы быть равными.
Откуда взялось ¶
До 2026-09-04 тип брался из стороннего модуля, не несшего лицензии НИ ОДНИМ файлом. Отсутствие лицензии означает «все права защищены», и публичный репозиторий с таким пином распространял чужой код без разрешения. Модуль снят целиком; поверхность здесь — та, которую дерево ЧИТАЛО, а не вся, что была. Держится гейтом `internal/repohygiene` `TestEveryPinnedModuleCarriesALicense`.
Index ¶
- type ValueOf
- func (val *ValueOf[T]) IsEq(other ValueOf[T], eq func(a, b T) bool) bool
- func (val *ValueOf[T]) IsNone() bool
- func (val ValueOf[T]) MarshalJSON() ([]byte, error)
- func (val *ValueOf[T]) Maybe() (T, bool)
- func (val *ValueOf[T]) Set(v T)
- func (val *ValueOf[T]) SomeOr(defVal T) T
- func (val ValueOf[T]) String() string
- func (val *ValueOf[T]) UnmarshalJSON(data []byte) error
- func (val *ValueOf[T]) Unset()
- func (val ValueOf[T]) Validate() error
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ValueOf ¶
type ValueOf[T any] struct { // contains filtered or unexported fields }
ValueOf — величина типа T вместе с признаком того, задана ли она.
Нулевое значение — «не задано», поэтому `var v ValueOf[T]` годно к употреблению сразу и означает именно отсутствие.
Поля неэкспортируемые НАМЕРЕННО: признак заданности и значение обязаны меняться вместе. Дай к ним доступ порознь — и появится состояние «задано, а значения нет», ради исключения которого тип и заведён.
func MustNewOption ¶
MustNewOption — заданная величина. Пустое значение T здесь означает «задано пустым», а не «не задано»: в этом всё различие.
func (*ValueOf[T]) IsEq ¶
IsEq — равенство по признаку заданности И по значению. Сравнение значений задаёт вызывающий: T произвольный, и оператор равенства к нему неприменим.
Два незаданных равны; заданное незаданному — никогда, даже если значение нулевое. Иначе различие, ради которого тип существует, терялось бы в сравнении.
func (ValueOf[T]) MarshalJSON ¶
MarshalJSON — отсутствие кодируется как null.
func (*ValueOf[T]) Maybe ¶
Maybe — величина и признак её заданности. Единственный способ прочитать значение: он вынуждает вызывающего решить, что делать с отсутствием.
func (*ValueOf[T]) SomeOr ¶
func (val *ValueOf[T]) SomeOr(defVal T) T
SomeOr — величина либо названное умолчание.
func (ValueOf[T]) String ¶
String — fmt.Stringer. Отсутствие называется словом, а не пустотой: пустая строка есть законное ЗНАЧЕНИЕ, и печатать её на месте отсутствия значило бы повторить в выводе ровно ту путаницу, которую тип устраняет.
func (*ValueOf[T]) UnmarshalJSON ¶
UnmarshalJSON — null читается как отсутствие; всё прочее разбирается в T и становится заданным. Неразбираемое НЕ задаёт величину: полуразобранное значение хуже отсутствующего.
func (*ValueOf[T]) Unset ¶
func (val *ValueOf[T]) Unset()
Unset — снять величину. Значение сбрасывается в нулевое, чтобы снятое не удерживало ссылок и не всплывало через отражение.