package main
import (
"fmt"
)
type Numbers struct {
x int
y int
}
func initial(number *Numbers) {
number.x = 1
number.y = 1
}
func final(number *Numbers) {
number = &Numbers{2, 2}
}
func main() {
p := Numbers{0, 0}
fmt.Println(p) //Prints {0 0}
initial(&p)
fmt.Println(p) //Prints {1 1}
final(&p)
fmt.Println(p) //Expected to print {2, 2} but prints {1, 1}
}
为什么initial
函数修改指针,而final
函数修改指针的副本?initial
和final
的函数参数都指向p
在main
中的内存地址; initial
设法更改p
,而final
不能。
任何解释,以便为什么是这种情况将不胜感激。
2条答案
按热度按时间5gfr0r5j1#
要修改指针所指向的数据,必须解引用该指针,解引用操作符是
*
,但是为了方便使用,Go语言在某些情况下会隐式地插入解引用操作,例如number.x = 1
被翻译成(*number).x = 1
。这种隐式转换可能会引起混淆,但是您应该看到,如果没有发生这种转换,那么表达式
number.x = 1
将毫无意义,因为number
是一种指针类型,并且指针没有字段。总之,
initial
函数具有隐式指针解引用,而final
没有。如果您将
final
更改为显式且正确地取消引用*number = Numbers{2, 2}
,那么它也将更改p
。siotufzp2#
initial
函数作用于传递的指针,该指针指向main
中分配的变量。所有更改都在main
中分配的对象上执行。final
函数接收相同的指针作为参数,但是它将指针赋给另一个Numbers
示例。main
中的对象永远不会改变。这两个函数都不涉及复制。