【发布时间】:2015-01-20 23:00:53
【问题描述】:
我正在阅读http://tour.golang.org/ 的 golang 教程,并在 example 29 中尝试了一些东西
这里复制原始示例供您参考:
package main
import "fmt"
type Vertex struct {
X, Y int
}
var (
p = Vertex{1, 2} // has type Vertex
q = &Vertex{1, 2} // has type *Vertex
r = Vertex{X: 1} // Y:0 is implicit
s = Vertex{} // X:0 and Y:0
)
func main() {
fmt.Println(p, q, r, s)
}
它非常基础,展示了如何创建这个花哨的新结构 Vertex 的实例。不过,Example 28 显示了通过指向顶点的指针来操作顶点,因此我稍微修改了示例并对输出感到惊讶。这是修改:
func main() {
t := *q
q.X = 4
u := *q
fmt.Println(p, q, r, s, t, u, t == u)
}
还有输出:
{1 2} &{4 2} {1 0} {0 0} {1 2} {4 2} false
让我吃惊的是t不是{4, 2},这似乎意味着改变q.X改变了q指向的结构的实例。来自 C/C++ 背景,这对我来说似乎是非常奇怪的行为。
那么,这里到底发生了什么?为什么使用q.X = 4改变顶点不传播到t?
【问题讨论】:
-
记住:Go 没有像
int &x这样的 C++ 样式引用。只有好的旧指针。 -
如果这有助于更好地可视化这一点play.golang.org/p/9GqtFpbIHWw