Пакет weak
Обзор
Пакет weak предоставляет способы безопасно ссылаться на память с помощью слабых ссылок, то есть не препятствуя её освобождению.
Указатель
Файлы пакета
doc.go pointer.go
тип Pointer
Pointer — это слабый указатель на значение типа T.
Как и обычные указатели, Pointer может ссылаться на любую часть объекта, например на поле структуры или элемент массива. Объекты, на которые указывают только слабые указатели, не считаются достижимыми, и как только объект становится недостижимым, Pointer.Value может вернуть nil.
Основные варианты использования слабых указателей — реализация кэшей, карт каноникализации (например, в пакете unique) и связывание времени жизни отдельных значений (например, с помощью карты со слабыми ключами).
Два значения Pointer равны тогда и только тогда, когда равны указатели, из которых они были созданы. Это свойство сохраняется даже после освобождения объекта, на который указывал указатель, использованный для создания слабой ссылки. Если несколько слабых указателей созданы для разных смещений внутри одного объекта (например, указатели на разные поля одной структуры), эти указатели не будут равны. Иными словами, слабые указатели соответствуют объектам и смещениям внутри этих объектов, а не обычным адресам. Если слабый указатель создан для объекта, который становится недостижимым, но затем снова становится достижимым благодаря финализатору, этот слабый указатель не будет равен слабым указателям, созданным после повторного появления объекта.
Вызов Make с указателем nil возвращает слабый указатель, для которого Pointer.Value всегда возвращает nil. Нулевое значение Pointer ведёт себя так, как будто оно было создано передачей nil в Make, и равно таким указателям.
Не гарантируется, что Pointer.Value в конечном счёте вернёт nil. Pointer.Value может вернуть nil сразу после того, как объект становится недостижимым. Значения, хранящиеся в глобальных переменных, а также значения, обнаруживаемые при обходе указателей от глобальной переменной, являются достижимыми. Аргумент или получатель функции может стать недостижимым в последний момент, когда функция обращается к нему. Чтобы гарантировать, что Pointer.Value не вернёт nil, передайте указатель на объект функции runtime.KeepAlive после последнего момента, когда объект должен оставаться достижимым.
Поскольку не гарантируется, что Pointer.Value в конечном счёте вернёт nil даже после того, как на объект больше нет ссылок, среда выполнения может применять оптимизацию, экономящую память, и размещать несколько объектов в одном слоте выделения памяти. Слабый указатель на объект без ссылок в таком слоте может никогда не стать nil, если тот же слот всегда занят объектом, на который есть ссылка. Обычно такое объединение происходит только для небольших объектов (размером порядка 16 байт или меньше), не содержащих указателей.
type Pointer[T any] struct {
// contains filtered or unexported fields
}
func Make 1.24
func Make[T any](ptr *T) Pointer[T]
Make создаёт слабый указатель из указателя на некоторое значение типа T.
func (Pointer[T]) Value
func (p Pointer[T]) Value() *T
Value возвращает исходный указатель, использованный для создания слабого указателя. Возвращается nil, если значение, на которое указывал исходный указатель, было освобождено сборщиком мусора. Если слабый указатель указывает на объект с финализатором, Value вернёт nil сразу после постановки финализатора объекта в очередь на выполнение.
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/weak/