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

时间:2013-04-17 20:16:26

标签: 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),
}

我想把我的链条分成几行,因为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),
}

我该怎么办?

2 个答案:

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

但是,这种长选择器操作符链在常用代码中并不常见。 (我认为标准库是惯用代码的非正式指南)。也许这个代码设计/结构可能存在一些缺点。