Когда я передаю переменную в закрытый метод в golang, создает ли он новый экземпляр? - PullRequest
0 голосов
/ 04 июня 2018

Если у меня есть основная функция:

var a = "foo"
modify(a)
fmt.Println(a)

, где

func modify(s string) error {
  s = "bar"
}

будет результат "foo" или "bar"?

1 Ответ

0 голосов
/ 04 июня 2018

Отсутствует.Он не скомпилируется, потому что ни 'foo', ни 'bar' не является одним символом.Но скажем, вы использовали вместо двойных кавычек.

В Golang аргументы передаются по значению (они копируются на новое место в памяти - стек или куча), и не имеет значения, является ли это частным или общедоступным методом или произвольной функцией.Новый экземпляр изменен.Результат вашего примера будет "foo".

. Чтобы изменить переменную, лежащую вне функции, вы должны явно передать указатель, указывающий на такую ​​переменную.

func modify(s *string) {
  *s = "bar"
}

...

var a = "foo"
modify(&a)
println(a) // will print "bar"

Inсам указатель этого случая передается по значениям (он копируется), но его значение (адрес a) по-прежнему указывает на ту же переменную.Таким образом, a можно изменить с помощью указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...