Go语言中的指针何时会自动解引用

43

最近我开始学习Go语言,但有一个很大的困惑点:我很难理解何时需要显式地取消引用指针。

例如,我知道.操作符将处理取消引用指针的情况。


ptr := new(SomeStruct)
ptr.Field = "foo" //Automatically dereferences

在哪些其他情况下,Go会这样做?例如,它似乎对数组有效。

ptr := new([5][5]int)
ptr[0][0] = 1

我无法在规范中找到这个内容,指针部分非常简短,甚至没有涉及解引用。如果有关Go指针解引用规则的任何澄清都将是极好的!


相关问题及其详细回答:https://dev59.com/G3rZa4cB1Zd3GeqP6sUj - greenoldman
1个回答

57

选择器表达式(例如x.f)会自动解引用指向结构体的指针。

如果x是一个指向结构体的指针,则x.y(*x).y的简写;如果字段y也是一个指向结构体的指针,则x.y.z(*(*x).y).z的简写,依此类推。如果x包含一个类型为*A的匿名字段,其中A也是结构体类型,则x.f(*x.A).f的快捷方式。

索引表达式的定义指定了可以对数组指针进行索引:

对于指向数组类型的a

  • a[x](*a)[x]的简写

那么规范中没有提到除选择器表达式之外的自动解引用吗? - daniel gratzer
我还没有找到它。要么是我眼瞎了,要么可能是规格中的遗漏。有人应该提交一个问题 - zzzz
4
我刚刚编辑了这篇文章,解释了如何对数组指针进行索引。 - Stephen Weinberg
但是以下代码会失败:s := &[]Struct{Struct{Name:"Test"}} fmt.Println(s[0].Name) - Kiril
3
我觉得如果Go语言决定允许指针和非指针对象引用,那么它们就不应该有这种混合自动解引用和有时不自动解引用的情况。更清晰的做法是在直接引用上使用.,在指针上使用->,这样至少可以清楚地知道某个东西是指针还是非指针。而且一直使用(*x)正是拥有->运算符的全部意义所在。 - theferrit32
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接