【问题标题】:how do you chain commands on several lines in go?你如何在 go 的几行上链接命令?
【发布时间】:2013-04-17 20:16:26
【问题描述】:

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

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

我能做什么?

【问题讨论】:

  • 似乎自动插入分号正在咬你。尝试将点移到行尾。
  • @FUZxxl,太好了,谢谢!
  • @amnotiam,我希望这部分代码是声明性的。我正在定义某种图表。
  • go fmt 是否拆分了这些长行?如果有,结果如何?

标签: go chaining


【解决方案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。所以你不会从中得到任何好处。

【讨论】:

  • 它看起来
【解决方案2】:

我可能会写一些变体:

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

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

【讨论】:

  • 虽然这可行,但我更喜欢 FUZxxl 提出的版本。链接在标准库中的math.big 中使用。
猜你喜欢
  • 2021-09-25
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多