索引表达式和指针解引用表达式的优先级

zer*_*kms 6

给出一个简单的表达式

*a[0]
Run Code Online (Sandbox Code Playgroud)

where a声明为*[]string(指向一片字符串的指针).

标准在哪里准确地解释了语言结构的评估顺序?

我发现它们中没有一个实际上是一个运算符,并且只是precedence提到了规范中提到的关键字:

  1. https://golang.org/ref/spec#Notation
  2. https://golang.org/ref/spec#Operators

那么,规范的哪一部分可以解释所提供表达式的评估顺序?

Adr*_*ian 6

最终部分是主要表达式

主表达式是一元和二元表达式的操作数。

它继续定义主要表达式,但基本上,这包括切片表达式,这意味着切片表达式a[0]是一元运算符的操作数*。指向数组的指针有一个特殊情况(见下文)。

根据地址运营商的说法:

对于 T 类型的操作数 x,地址运算 &x 生成一个指向 x 的 *T 类型的指针。操作数必须是可寻址的,即变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,x 也可以是(可能带括号的)复合文字。如果 x 的计算会导致运行时恐慌,那么 &x 的计算也会导致运行时恐慌。

对于指针类型 *T 的操作数 x,指针间接寻址 *x 表示 x 指向的类型 T 的变量。如果 x 为零,则尝试计算 *x 将导致运行时恐慌。

意味着,但没有明确声明,在计算间接值之前,将指针间接运算符右侧的切片索引表达式或字段选择器表达式作为一个整体进行计算。

另外,指针间接寻址 ( *x)一个运算符,具体来说,是一个地址运算符。切片索引引用不是运算符,而是索引表达式

另请注意:

对于指向数组类型的指针:

a[x]是简写(*a)[x]

但对于指向切片类型的指针却不能这样说。