Skip to content

Instantly share code, notes, and snippets.

@bwangelme
Last active July 19, 2018 12:45
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save bwangelme/ac6783f85687665ede3d46c605eb9bba to your computer and use it in GitHub Desktop.
Save bwangelme/ac6783f85687665ede3d46c605eb9bba to your computer and use it in GitHub Desktop.

表达式

表达式是操作符将操作数组合起来形成的。操作符除了我们熟知的加减乘除二元的和正负号这种一元的外,还有像函数调用使用的()和数组,map索引使用的[]等等, 所以foo()v_map[index]都是一个表达式。而像已经定义的变量,例如x,它其实可以理解成(x),所以它也是一个表达式。

赋值语句

参考了了一下 Go 的文档,赋值语句应该和 标识符 没有关系,它的定义是这样的:

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

也就是说,赋值语句就是 表达式 赋值操作符 表达式 的形式,它的操作符的左右两边都是表达式,赋值语句的定义中没有标识符。而标识符在 Go 语言中有两种形式:

  1. var x int
  2. x := 3

上面两种情况中x都是标识符。

关于赋值语句,感觉 @reus V友的描述更准确一些,表达式不能赋值,但是可以给表达式求值的结果赋值。

RecvStmt

RecvStmt 有两种形式:

  1. Expression = RecvExpr
  2. IdentifierList := RecvExpr

e, ok := <-ch1 这种 short variable declaration 形式的应该属于第二种。 而像x = <-ch1v_map[index] = <-ch1这种形式都是赋值语句,属于第一种情况。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment