如何在go中的几行上链接命令?

Fab*_*ien 4 go chaining

我想以这种方式链接命令:

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),
}
Run Code Online (Sandbox Code Playgroud)

我想把我的链子分成几行,因为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),
}
Run Code Online (Sandbox Code Playgroud)

我能做什么 ?

nem*_*emo 9

正如FUZxxl所指出的,你的问题是自动插入分号.规范说:

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

  • 标识符
  • 整数,浮点,虚数,符文或字符串文字
  • 其中一个关键字是break,continue,fallthrough或return
  • 其中一个运算符和分隔符++, - ,),]或}

你有一个函数调用,它计算)一个分号,在行的末尾添加一个分号.

要绕过自动分号转换,您可以通过以下方式之一编写调用:

使用.而不是分号:

x.
Method(p1,p2,p3)
Run Code Online (Sandbox Code Playgroud)

在参数列表开始之后而不是在函数之前中断:

x.Method(
   p1,p2,p3, // , at the end is important to prevent semicolon insertion
)
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢上述方法,您可以(从go1.1开始)将方法视为头等公民,并临时创建可能更短的快捷方式:

f = x.Method
f(p1,p2,p3).f(p3,p4,p5)
Run Code Online (Sandbox Code Playgroud)

我对这个例子的想法不够.f(...).f(...)当然不可能,因为f没有成员的返回值f.人们不得不重新分配f.所以你从中获得了一切.