Pointers 什么时候去';s指针解除了自身的引用

Pointers 什么时候去';s指针解除了自身的引用,pointers,go,Pointers,Go,我最近刚刚开始深入研究Go,我有一个主要的困惑点:我很难理解什么时候明确地取消引用指针是必要的 例如,我知道操作符将处理对指针的解引用 ptr := new(SomeStruct) ptr.Field = "foo" //Automatically dereferences 在其他什么情况下,go会这样做?例如,它似乎与数组有关 ptr := new([5][5]int) ptr[0][0] = 1 我在规范中找不到这一点,指针部分非常短,甚至没有涉及到解引用。任何关于去引用go指针的规则的

我最近刚刚开始深入研究Go,我有一个主要的困惑点:我很难理解什么时候明确地取消引用指针是必要的

例如,我知道
操作符将处理对指针的解引用

ptr := new(SomeStruct)
ptr.Field = "foo" //Automatically dereferences
在其他什么情况下,go会这样做?例如,它似乎与数组有关

ptr := new([5][5]int)
ptr[0][0] = 1
我在规范中找不到这一点,指针部分非常短,甚至没有涉及到解引用。任何关于去引用go指针的规则的澄清都是非常棒的

(例如,
x.f
)执行以下操作:

选择器自动取消指向结构的指针的引用。如果
x
是指向结构的指针,
x.y
(*x.y
)的缩写;如果字段
y
也是指向结构的指针,
x.y.z
(*(*x.y).z
等的简写。如果
x
包含类型为
*A
的匿名字段,其中
A
也是一种结构类型,
x.f
(*x.A).f
的快捷方式

的定义指定可以为数组指针编制索引:

对于
a
*a
类型,其中
a
是数组类型,或者对于
S
类型,其中
S
是切片类型


所以在规范中没有提到除了选择器表达式之外的自动取消引用?我还没有找到它。要么我是瞎子,要么这可能是规格中的遗漏。也许应该有人来填补空缺。我刚刚编辑了这篇文章来解释数组指针是如何被索引的。太好了,非常感谢。以前读过两遍,我真的是瞎了眼:-(我觉得如果Go决定同时允许指针对象引用和非指针对象引用,它们就不应该有这种有时自动延迟,有时不自动延迟的混合。在直接引用上使用
,在指针上使用
->
会更清楚,所以至少当某个对象是指针还是非指针时会更清楚g待办事项(*x)始终是拥有
->
操作员的关键所在。相关问题和信息丰富的答案: