Означает ли передача переменной в функцию в Golang, что она будет иметь собственное состояние внутри функции, или будет использоваться только 1 адрес памяти?

Как функция взаимодействует с переменной, если ей передать эту переменную как аргумент? Создается ли новая область памяти для переменной в функции, или она продолжает ссылаться на оригинальную переменную из основной программы?
  • 9 июня 2024 г. 10:51
Ответы на вопрос 2
В Golang переменные передаются в функции по значению, что означает, что создается копия переменной, а не передается сама переменная или ссылка на нее. Это означает, что внутри функции переменная будет использовать свою собственную область памяти.

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

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

1. Мапы и каналы всегда передаются по указателю.
2. У слайса на стеке только дескриптор, так что он копируется, но данные, на которые слайс указывал, остаются там же в памяти, где и были.
3. Если вы явно передаете указатель, то тут все очевидно.
4. У интерфейсов копируется дескриптор, но т.к. в дескрипторе указатель, то тут все как со слайсами.
Похожие вопросы