表达式是操作符将操作数组合起来形成的。操作符除了我们熟知的加减乘除二元的和正负号这种一元的外,还有像函数调用使用的()
和数组,map索引使用的[]
等等,
所以foo()
和v_map[index]
都是一个表达式。而像已经定义的变量,例如x
,它其实可以理解成(x)
,所以它也是一个表达式。
参考了了一下 Go 的文档,赋值语句应该和 标识符 没有关系,它的定义是这样的:
Assignment = ExpressionList assign_op ExpressionList .
assign_op = [ add_op | mul_op ] "=" .
也就是说,赋值语句就是 表达式 赋值操作符 表达式
的形式,它的操作符的左右两边都是表达式,赋值语句的定义中没有标识符。而标识符在 Go 语言中有两种形式:
var x int
x := 3
上面两种情况中x都是标识符。
关于赋值语句,感觉 @reus V友的描述更准确一些,表达式不能赋值,但是可以给表达式求值的结果赋值。
RecvStmt 有两种形式:
Expression = RecvExpr
IdentifierList := RecvExpr
像 e, ok := <-ch1
这种 short variable declaration 形式的应该属于第二种。
而像x = <-ch1
和v_map[index] = <-ch1
这种形式都是赋值语句,属于第一种情况。