Распространенная дилемма при определении методов структуры.
В частности, при выборе приемников метода, следует ли использовать приемники указателя или приемники значений?
func (t *Type) Method() {} //pointer receiver
против
func (t Type) Method() {} //value receiver
Получатели методов могут быть уподоблены аргументам функции в их поведении, и все, что применимо для передачи указателя или значения в качестве аргумента функции, по-прежнему применимо к получателям методов.
Когда следует использовать указательные приемники
Изменить приемник
Если вы хотите изменить состояние получателя в методе, манипулируя его значением,использовать приемник указателя. Это невозможно с приемником значения, который копирует по значению. Любая модификация получателя значения является локальной для этой копии.
Оптимизация
Если структура, для которой вы определяете метод, очень велика, ее копирование будет намного дороже, чем использование приемника значения.
Получатели значений работают с копией значения исходного типа. Это означает, что есть затраты, особенно если структура очень большая, а полученные указатели более эффективны.
Когда получатели стоимости лучше
Если вам не нужно редактировать значение приемника,использовать приемник стоимости.
Получатели значений безопасны для параллелизма, в то время какполучатели указателей не безопасны для параллелизма.
Когда стоит пойти на компромисс
Существует ситуация, когда вы можете захотеть использовать приемники указателя для методов, в которых вы обычно используете приемник значения, и это когда у вас есть другие приемники указателя, определенные для этого типа, и дляпоследовательностьвы должны использовать получатели указателей во всех методах.
Прочитайте больше
Больше руководств по go:
- Использование обратного прокси NGINX для обслуживания сервисов Go
- Создание копии структуры в Go
- Основы веб-сервера Go
- Сортировка типа карты в Go
- Вкратце об указателях Go
- Объяснение тегов Go
- Форматирование даты и времени Go
- Обработка JSON с помощью Go
- Перейти к переменным функциям
- Шпаргалка по струнам Go
- Объяснение интерфейса Go Empty
- Отладка Go с помощью VS Code и Delve
- Именованный Go возвращает параметры
- Генерация случайных чисел и строк в Go
- Структура файловой системы проекта Go
- Алгоритм двоичного поиска, реализованный в Go
- Использование флагов командной строки в Go
- GOPATH объяснил
- Создайте приложение командной строки с помощью Go: lolcat
- Создание команды интерфейса командной строки с помощью Go: cowsay
- Использование Shell Pipes с Go
- Учебник по интерфейсу командной строки: Fortune Clone
- Перечислить файлы в папке с помощью Go
- Используйте Go, чтобы получить список репозиториев с GitHub
- Пойдите, добавьте фрагмент строк в файл
- Пойдите, преобразуйте строку в срез байтов
- Визуализируйте свой вклад в Git с помощью Go
- Начало работы с Go CPU и профилирование памяти
- Устранение ошибки "не поддерживает индексацию" в программе Go
- Измерение времени выполнения в программе Go
- Создание веб-краулера с Go для обнаружения повторяющихся заголовков
- Go Best Practices: указатель или приемники значений?
- Go Best Practices: следует ли использовать метод или функцию?
- Структуры данных Go: установить
- Шпаргалка по картам Go
- Создание реализаций для универсальных типов в Go
- Структуры данных Go: словарь
- Структуры данных Go: хеш-таблица
- Реализуйте прослушиватели событий в проходных каналах
- Структуры данных Go: стек
- Структуры данных Go: очередь
- Структуры данных Go: двоичное дерево поиска
- Структуры данных Go: график
- Структуры данных Go: связанный список
- Полное руководство по структурам данных Go
- Сравнение значений Go
- Является ли Go объектно-ориентированным?
- Работа с базой данных SQL в Go
- Использование переменных среды в Go
- Учебник: REST API на базе PostgreSQL
- Включение CORS на веб-сервере Go
- Развертывание приложения Go в контейнере Docker
- Почему Go - мощный язык для изучения PHP-разработчика
- Пойдите, удалите символ новой строки io.Reader.ReadString
- Идите, как посмотреть изменения и пересобрать вашу программу
- Иди, посчитай месяцы с даты
- Доступ к параметрам HTTP POST в Go