原文地址是 https://go.dev/ref/spec#PrimaryExpr
原文内容是
PrimaryExpr =
Operand |
Conversion |
MethodExpr |
PrimaryExpr Selector |
PrimaryExpr Index |
PrimaryExpr Slice |
PrimaryExpr TypeAssertion |
PrimaryExpr Arguments .
Selector = "." identifier .
Index = "[" Expression "]" .
Slice = "[" [ Expression ] ":" [ Expression ] "]" |
"[" [ Expression ] ":" Expression ":" Expression "]" .
TypeAssertion = "." "(" Type ")" .
Arguments = "(" [ ( ExpressionList | Type [ "," ExpressionList ] ) [ "..." ] [ "," ] ] ")" .
其中我关心的是 Arguments 的定义,它表示为 ( ExpressionList | Type [ "," ExpressionList ] )
ExpressionList
很容易理解,它可以匹配 (1,2,string(1))
这样的文本,但是 Type [ExpressionList]
怎么理解呢,我从来没见过在 go 里可以写 var v = func_call(TypeName)
这样的表达式
(在上面引用的文本中,[ ]
包裹的内容表示为可选, |
表示匹配其中一个)
1
blless 2022-07-12 15:12:58 +08:00
定义接口的时候可以吧参数名省略 直接写类型
|
2
blless 2022-07-12 15:17:16 +08:00
额 感觉是我理解错了 确实没见过。。不知道参数定义算不算参数语法表达式
|
3
mainjzb 2022-07-12 15:17:32 +08:00 1
make
new |
4
EAFA0 2022-07-12 17:40:17 +08:00
var action = func(context.Context)
是这样的吗? 这个语法是可行的 |
5
chai2010 2022-07-12 19:58:09 +08:00
ast 解析时,type 和表达式是不怎么区分的,new(int)里 int 可以是类型也可能被重新定义为一个变量。真正的语义需要在 Go/types 包处理。
欢迎关注《 Go 语言定制指南》 https://github.com/chai2010/go-ast-book |