一尘不染

您如何在多行代码中链接命令?

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),
}

由于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),
}

我能做什么 ?


阅读 208

收藏
2020-07-02

共1个答案

一尘不染

正如FUZxxl指出的那样,您的问题是分号的自动插入。规格说明:

当输入被分解为令牌时,如果该行的最终令牌为,则将分号自动插入到非空白行的末尾的令牌流中。

  • 标识符
  • 整数,浮点数,虚数,符文或字符串文字
  • 关键字之一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。因此,您从中一无所获。

2020-07-02