我想以这种方式链接命令:
var cmdGroups = []*commands.CmdGroup {
commands.MakeCmdGroup("foo", cmd1, cmd2, cmd3).AddConstraint(cmd1, cmd2).AddConstraint(cmd2, cmd1, cmd3),
commands.MakeCmdGroup("bar", cmd1, cmd4).AddConstraint(cmd1, cmd4),
}
我想把我的链条分成几行,因为80列长度的原因,但Go不会让我编译这个:
var cmdGroups = []*commands.CmdGroup {
commands.MakeCmdGroup("foo", cmd1, cmd2, cmd3)
.AddConstraint(cmd1, cmd2)
.AddConstraint(cmd2, cmd1, cmd3),
commands.MakeCmdGroup("bar", cmd1, cmd4)
.AddConstraint(cmd1, cmd4),
}
我该怎么办?
答案 0 :(得分:8)
正如FUZxxl所指出的,你的问题是自动插入分号。 规范说:
当输入被分解为标记时,会自动添加分号 如果是,则在非空行的末尾插入令牌流 line的最终标记是
- 标识符
- 整数,浮点,虚数,符文或字符串 字面
- 其中一个关键字是break,continue,fallthrough或return
- 其中一个运算符和分隔符++, - ,),]或}
你有一个函数调用,它计算)
,所以在行的末尾添加了一个分号。
要绕过自动分号转换,您可以使用以下方法之一编写呼叫 方法:
使用.
代替分号:
x.
Method(p1,p2,p3)
在参数列表开始后而不是在函数之前中断:
x.Method(
p1,p2,p3, // , at the end is important to prevent semicolon insertion
)
如果你不喜欢上面的方法,你可以(从go1.1开始)将方法视为第一类
公民并暂时创建可能更短的捷径:
f = x.Method
f(p1,p2,p3).f(p3,p4,p5)
我还没有想到
用这个例子。 f(...).f(...)
当然不可能,因为f
的返回值没有成员f
。
人们必须重新分配f
。所以你从中得不到任何东西。
答案 1 :(得分:1)
我可能会写一些变体:
var cmdGroups = []*commands.CmdGroup{
commands.MakeCmdGroup(
"foo", cmd1, cmd2, cmd3,
).AddConstraint(
cmd1, cmd2,
).AddConstraint(
cmd2, cmd1, cmd3,
),
commands.MakeCmdGroup(
"bar", cmd1, cmd4,
).AddConstraint(cmd1, cmd4),
}
但是,这种长选择器操作符链在常用代码中并不常见。 (我认为标准库是惯用代码的非正式指南)。也许这个代码设计/结构可能存在一些缺点。