Go Best Practices: указатель или приемники значений?

Распространенная дилемма при определении методов структуры.

В частности, при выборе приемников метода, следует ли использовать приемники указателя или приемники значений?

func (t *Type) Method() {} //pointer receiver

против

func (t Type) Method() {} //value receiver

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

Когда следует использовать указательные приемники

Изменить приемник

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

Оптимизация

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

Получатели значений работают с копией значения исходного типа. Это означает, что есть затраты, особенно если структура очень большая, а полученные указатели более эффективны.

Когда получатели стоимости лучше

Если вам не нужно редактировать значение приемника,использовать приемник стоимости.

Получатели значений безопасны для параллелизма, в то время какполучатели указателей не безопасны для параллелизма.

Когда стоит пойти на компромисс

Существует ситуация, когда вы можете захотеть использовать приемники указателя для методов, в которых вы обычно используете приемник значения, и это когда у вас есть другие приемники указателя, определенные для этого типа, и дляпоследовательностьвы должны использовать получатели указателей во всех методах.

Прочитайте больше


Больше руководств по go: