2013-04-17 51 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