Параметры действуют как локальные переменные внутри функции. Вы можете изменить их значения, но это только изменит значения локальных переменных. Они не зависят от переменных, значение которых вы передаете.
Если вы хотите что-то изменить, вы должны передать его адрес и изменить значение остроконечное , например ::
func main() {
var x int
fmt.Println("before", x)
set(&x)
fmt.Println("after", x)
}
func set(i *int) {
*i = 2
}
Выходы (попробуйте на Go Playground ):
before 0
after 2
То же самое относится и к переменным-указателям: если вы хотите изменить переменную-указатель, вам снова нужно передать ее адрес и изменить указанное значение. В случае указателя тип будет указателем на указатель, например ::
func main() {
var x *int
x = new(int)
fmt.Println("before", x, *x)
set(&x)
fmt.Println("after", x, *x)
}
func set(i **int) {
p := new(int)
*p = 2
*i = p
}
Вывод (попробуйте на Go Playground ):
before 0x416020 0
after 0x416040 2
Конечно, если у вас есть переменная указателя и вы не хотите изменять значение указателя только указанным значением, вы можете просто передать указатель и изменить указанное значение:
func main() {
var x *int
x = new(int)
fmt.Println("before", x, *x)
set(x)
fmt.Println("after", x, *x)
}
func set(i *int) {
*i = 2
}
Вывод (попробуйте на Go Playground ):
before 0x416020 0
after 0x416020 2
Заметьте одно: вы не можете передать указатель nil
на функцию и ожидать, что сможете назначить что-либо указанному значению: nil
указатели указывают на никуда. Вы должны передать указатель, отличный от nil
, или в качестве альтернативы вы можете вернуть значение указателя (и назначить его вызывающей стороне).