转到结构文字,为什么这个是可寻址的?

5 struct pointers go language-lawyer composite-literals

我正在阅读“Go 编程语言”一书。这对我们(而是)有经验的程序员来说非常好,并解释了其他语言交叉点之间的差异——但我发现了一个我不完全理解的案例。

我非常了解 C++,并且我知道 Go 调用(在 C++ 中会被称为)rvalues/xvalues“不可寻址”。只有“变量” [GOPL 的话] 是可寻址的。

好,可以; 这说得通。

因此,例如,这是非法的(根据第一次印刷的第 159 页)

Point{1, 2}.ScaleBy(2) // compile error: can't take address of Point literal
Run Code Online (Sandbox Code Playgroud)

因为(*Point).ScaleBy将 a*Point作为接收器参数,而Point文字是不可寻址的。

(如果你还没有读过这本书,Point是一个带有 fields 的结构体X, Y float64

然而,在第 162 页,我们有

type ColoredPoint struct {
    *Point
    Color color.RGBA
}

p := ColoredPoint(&Point{1, 1}, red)
// ...more code ...
Run Code Online (Sandbox Code Playgroud)

这显然是有效的并且会编译。

题:

为什么Point第二种情况下的文字是可寻址的?

这是为了方便起见的特例,还是我在大局中遗漏了什么?

Ala*_*van 5

&T{}表示法在第 103 页的第 4.4.1 节结构文字中进行了解释:

因为结构体通常通过指针来处理,所以可以使用这种速记符号来创建和初始化结构体变量并获取其地址:

pp := &Point{1, 2}
Run Code Online (Sandbox Code Playgroud)

它完全等同于

pp := new(Point)
*pp = Point{1, 2}
Run Code Online (Sandbox Code Playgroud)

&Point{1, 2}可以直接在表达式中使用,例如函数调用。

很高兴你在其他方面喜欢这本书。