询问下 Go 的这个语法是否存在

2022-07-12 15:03:45 +08:00
 fumeboy

原文地址是 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) 这样的表达式

(在上面引用的文本中,[ ] 包裹的内容表示为可选, | 表示匹配其中一个)

2142 次点击
所在节点    Go 编程语言
5 条回复
blless
2022-07-12 15:12:58 +08:00
定义接口的时候可以吧参数名省略 直接写类型
blless
2022-07-12 15:17:16 +08:00
额 感觉是我理解错了 确实没见过。。不知道参数定义算不算参数语法表达式
mainjzb
2022-07-12 15:17:32 +08:00
make
new
EAFA0
2022-07-12 17:40:17 +08:00
var action = func(context.Context)

是这样的吗? 这个语法是可行的
chai2010
2022-07-12 19:58:09 +08:00
ast 解析时,type 和表达式是不怎么区分的,new(int)里 int 可以是类型也可能被重新定义为一个变量。真正的语义需要在 Go/types 包处理。

欢迎关注《 Go 语言定制指南》 https://github.com/chai2010/go-ast-book

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/865679

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX