英文:
Golang selectors - question about pointers spec sample
问题
我正在阅读有关选择器的规范:https://golang.org/ref/spec#Selectors
type T0 struct {
x int
}
func (*T0) M0()
type T1 struct {
y int
}
func (T1) M1()
type T2 struct {
z int
T1
*T0
}
func (*T2) M2()
type Q *T2
var t T2 // t.T0 != nil
var p *T2 // p != nil and (*p).T0 != nil
我不理解最后两行的注释。
在我这里,t 和 p 都是 nil。
英文:
I'm reading the spec about selectors: https://golang.org/ref/spec#Selectors
type T0 struct {
x int
}
func (*T0) M0()
type T1 struct {
y int
}
func (T1) M1()
type T2 struct {
z int
T1
*T0
}
func (*T2) M2()
type Q *T2
var t T2 // with t.T0 != nil
var p *T2 // with p != nil and (*p).T0 != nil
I don't understand the comments of the last two lines.
At me t and p = nil
答案1
得分: 1
规范中写道:
> 例如,给定以下声明:
>
> [你复制的代码片段]
>
> 可以这样写:
>
> [另一个带有选择器示例的代码片段]
考虑 var t T2
。结构体 T2
嵌入了一个指向 T0
的指针。因此注释中的“with t.T0 != nil”表示类型为 T2
的变量 t
具有非空的嵌入 T0
字段。基本上是这样的:
var t = T2{
T0: &T0{},
}
然后,对于这样的变量,你可以编写选择器表达式 t.x
,它等同于后续代码片段中显示的 (*t.T0).x
。由于 x
是仅在 T0
中声明的字段,表达式 t.x
相当于对嵌入的 t.T0
进行解引用,为了使其有效,t.T0
必须是非空的。
对于 var p *T2
也是一样的:嵌入的 T0
必须是非空的,而且 p
本身必须是非空的(它是一个指针)。基本上是这样的:
var p = &T2{
T0: &T0{},
}
然后你可以编写表达式 p.x
,它相当于对 p
和嵌入的 T0
字段进行解引用,就像注释中显示的 (*(*p).T0).x
。
英文:
The specs says:
> For example, given the declarations:
>
> [the code snippet you copied]
>
> one may write:
>
> [another code snippet with selector examples]
Consider var t T2
. The struct T2
embeds a pointer to T0
. So the comment "with t.T0 != nil" means a variable t
of type T2
with a non-nil embedded T0
field. Basically this:
var t = T2{
T0: &T0{},
}
Then with such a variable, you can write the selector expression t.x
, which equals (*t.T0).x
showed in the subsequent code snippet. Since x
is a field declared only in T0
, the expression t.x
amounts to dereferencing the embedded t.T0
, which must be non-nil for that to be valid.
Same goes for var p *T2
: the embedded T0
must be non-nil, and p
itself must be non-nil (it's a pointer). Basically this:
var p = &T2{
T0: &T0{},
}
Then you can write the expression p.x
, which amounts to dereferencing both p
and the embedded T0
field as shown in the comment (*(*p).T0).x
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论