你能解释一下这个 Go 指针操作的行为吗?
Can you explain the behavior of this Go pointer manipulation?
package main
import "fmt"
type Item struct {
val int
}
func main() {
var items []*Item
item := Item{}
items = append(items, &item)
x := items[0]
y := *x
x.val++
fmt.Printf("x=%v, y=%v\n", *x, y)
}
这会打印:
x={1}, y={0}
我不明白为什么值不同。 x
是指向数组中第一个元素的指针,我们使用 x
递增 val
字段,然后第一个元素已更改。 y
是第一个元素,它的 val
应该也改变了,但没有?但是,如果 y := *x
语句移动到 x.val++
之后,则值相等。为什么?
只需要解释这一行
y := *x
意思是从这个指针 (*x
) 中获取值并将其分配给 y
,现在 y
有一个新的未连接到 x
的值。
因为x
已经是一个指向Item的指针。试试 y := x
package main
import "fmt"
type Item struct {
val int
}
func main() {
var items []*Item
item := Item{}
items = append(items, &item)
x := items[0]
y := *x
x.val++
fmt.Printf("x=%v, y=%v\n", *x, y)
}
这会打印:
x={1}, y={0}
我不明白为什么值不同。 x
是指向数组中第一个元素的指针,我们使用 x
递增 val
字段,然后第一个元素已更改。 y
是第一个元素,它的 val
应该也改变了,但没有?但是,如果 y := *x
语句移动到 x.val++
之后,则值相等。为什么?
只需要解释这一行
y := *x
意思是从这个指针 (*x
) 中获取值并将其分配给 y
,现在 y
有一个新的未连接到 x
的值。
因为x
已经是一个指向Item的指针。试试 y := x