Я знаю, что указатели в Go позволяют изменять аргументы функции, но было бы проще, если бы они принимали только ссылки (с соответствующими константными или изменяемыми квалификаторами). Теперь у нас есть указатели и для некоторых встроенных типов, таких как карты и каналы, неявная передача по ссылке.
Я что-то упускаю или указатели в Go - ненужное усложнение?
Ответы:
Мне очень нравится пример из http://www.golang-book.com/8
в отличие от
источник
Указатели полезны по нескольким причинам. Указатели позволяют контролировать структуру памяти (влияет на эффективность кеш-памяти ЦП). В Go мы можем определить структуру, в которой все члены находятся в непрерывной памяти:
В этом случае
Point
структуры встроены вLineSegment
структуру. Но вы не всегда можете встроить данные напрямую. Если вы хотите поддерживать такие структуры, как двоичные деревья или связанный список, вам необходимо поддерживать какой-то указатель.Java, Python и т. Д. Не имеют этой проблемы, потому что они не позволяют вам встраивать составные типы, поэтому нет необходимости синтаксически различать встраивание и указание.
Проблемы со структурами Swift / C # решены с помощью указателей Go
Возможная альтернатива для достижения того же - различать
struct
иclass
как это делают C # и Swift. Но у этого есть ограничения. Хотя обычно вы можете указать, что функция принимает структуру в качествеinout
параметра, чтобы избежать копирования структуры, это не позволяет вам хранить ссылки (указатели) на структуры. Это означает, что вы никогда не можете рассматривать структуру как ссылочный тип, если сочтете это полезным, например, для создания распределителя пула (см. Ниже).Пользовательский распределитель памяти
Используя указатели, вы также можете создать свой собственный распределитель пула (это очень упрощено с удалением множества проверок, чтобы просто показать принцип):
Поменять местами два значения
Указатели также позволяют реализовать
swap
. Это меняет местами значения двух переменных:Вывод
Java так и не смогла полностью заменить C ++ для системного программирования в таких местах, как Google, отчасти потому, что производительность не может быть настроена в той же степени из-за отсутствия возможности контролировать структуру и использование памяти (промахи в кэше значительно влияют на производительность). Go нацелен на замену C ++ во многих областях и, следовательно, должен поддерживать указатели.
источник
Ссылки нельзя переназначить, в отличие от указателей. Уже одно это делает указатели полезными во многих ситуациях, когда ссылки использовать нельзя.
источник
Go разработан как лаконичный, минималистский язык. Поэтому он начался только с значений и указателей. Позже, по необходимости, были добавлены некоторые ссылочные типы (срезы, карты и каналы).
Язык программирования Go: вопросы и ответы по языковому дизайну: почему карты, фрагменты и каналы являются ссылками, а массивы - значениями?
«По этой теме много истории. Раньше карты и каналы были синтаксически указателями, и было невозможно объявить или использовать экземпляр без указателя. Кроме того, мы боролись с тем, как должны работать массивы. В конце концов мы решили, что строгое разделение указателей и значений усложнили использование языка. Введение ссылочных типов, в том числе срезов для обработки ссылочной формы массивов, решило эти проблемы. Ссылочные типы добавляют некоторую прискорбную сложность языку, но они имеют большое влияние на удобство использования: Go стал более продуктивный, удобный язык, когда они были представлены ».
Быстрая компиляция - основная цель разработки языка программирования Go; это имеет свои издержки. Одной из жертв, по-видимому, является возможность отмечать переменные (за исключением базовых постоянных времени компиляции) и параметры как неизменяемые. Был запрошен, но отклонен.
golang-nut: иди, язык. Некоторые отзывы и сомнения.
"Добавление const к системе типов заставляет его появляться повсюду и вынуждает удалять его везде, если что-то изменится. Хотя может быть некоторая выгода в том, чтобы отмечать объекты как неизменяемые каким-то образом, мы не думаем, что квалификатор типа const поможет идти."
источник