2013-04-17 52 views
3

我想链的命令是这样的:你如何链接几行命令?

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列,长的原因,只好不让我编译这个:

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

似乎automagic分号插入在这里咬你。尝试将点移动到行的末尾。 – fuz

+3

http://play.golang。org/p/PfKEIo3zlG < - 像这样 – fuz

+0

@FUZxxl,这很完美,谢谢! – Fabien

回答

8

正如FUZxxl指出的,你的问题是自动插入分号。 该规范表示:

当输入被分成记号,分号自动是 在一个非空行的端部插入到令牌流,如果 线的最后一个标记是

  • 标识符
  • 的整数,浮点,假想,符或字符串 字面
  • 的关键字之一断裂,继续,下通,或返回
  • 012运营商和分隔符++,的
  • 一个 - , - ),],或}

你有一个函数调用,该计数为一个)所以分号在该行的末尾添加。

为了规避自动分号转换,你可以写你的电话在以下 方式之一:

使用.而不是分号:之前的参数列表的开始之后,而不是

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

我可能会写一些变种:

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

尽管这样可行,但我更喜欢FUZxxl提出的版本。链接用在标准库中的'math.big'中。 – nemo