Какая разница между указателем и значением в структуре?

Учитывая следующую структуру:

type Exp struct {
  foo int,
  bar *int
}

В чем разница в сроке исполнения при использовании указателя или значения в структуре. Есть ли накладные расходы или это только две школы программирования Go?

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

PS: в вышеприведенной структуре мы говорим о простом int, но это может быть любой другой тип (даже настраиваемый)

Ответ 1

Используйте форму, наиболее функциональную для вашей программы. В принципе, это означает, что если полезно использовать значение nil, то используйте указатель.

С точки зрения производительности примитивные числовые типы всегда более эффективны для копирования, чем для разыменования указателя. Еще более сложные структуры данных, как правило, быстрее копировать, если они меньше, чем строка кэша или две (более 128 байт - хорошее правило для процессоров x86).

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

Это отличная серия статей, если вы хотите лучше понять, как взаимодействуют память и программное обеспечение: "Что каждый программист должен знать о памяти" .

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

  • Используйте указатель, если вам нужно передать что-то, что нужно изменить.
  • Используйте указатель, если вам нужно определить, было ли что-то отменено/нет.
  • Используйте указатель, если вы используете тип, имеющий методы с приемниками указателей.

Ответ 2

Если размер указателя меньше, чем элемент struct, то использование указателя более эффективно, поскольку вам не нужно копировать элемент, а только его адрес. Кроме того, если вы хотите иметь возможность перемещать или совместно использовать какую-либо часть структуры, лучше иметь указатель, чтобы вы могли снова поделиться только адресом члена. См. Также golang faqs.