【发布时间】:2016-11-24 19:17:56
【问题描述】:
我正在阅读《Go 编程语言》这本书。这对我们(相当)有经验的程序员来说非常好,并解释了其他语言交集之间的差异——但我发现了一个我不完全理解的案例。
我非常了解 C++,并且我理解 Go 调用(在 C++ 中将被称为)右值/xvalues“不可寻址”。只有“变量” [GOPL 的话] 是可寻址的。
好的,很公平;这是有道理的。
因此,例如,这是非法的(根据第 159 页的第一次印刷)
Point{1, 2}.ScaleBy(2) // compile error: can't take address of Point literal
因为(*Point).ScaleBy 将*Point 作为接收器参数,而Point 文字是不可寻址的。
(如果你没有读过这本书,Point 是一个带有字段X, Y float64 的结构体。
然而,在第 162 页,我们有
type ColoredPoint struct {
*Point
Color color.RGBA
}
p := ColoredPoint(&Point{1, 1}, red)
// ...more code ...
这显然是有效的并且会编译。
问题:
为什么第二种情况下的 Point 文字是可寻址的?
这是为了方便起见的特殊情况,还是我在大局中遗漏了什么?
【问题讨论】:
标签: pointers go struct language-lawyer composite-literals