是否有可能在go中写出一个"流畅"的风格api?

Dou*_*oug 3 go

其他几种语言具有'流畅'或链式调用风格的api,允许你做这样的调用:

public class CatMap : ClassMap<Cat>
{
  public CatMap()
  {
    Id(x => x.Id);
    Map(x => x.Name)
      .Length(16)
      .Not.Nullable();
    Map(x => x.Sex);
    References(x => x.Mate);
    HasMany(x => x.Kittens);
  }
}
Run Code Online (Sandbox Code Playgroud)

值得注意的例子包括流畅的nhibernate,jquery方法链接等.这是一个常见的(我会说很受欢迎)api设计模式.

问题:go语法似乎不支持这一点.

您可以在go中执行此操作:

var blah = X().Y().Thing().OtherThing()
Run Code Online (Sandbox Code Playgroud)

...但是这个:

package main

import "n"

func main() {
    n.Log(":D")
    .Example()
    .Example
}
Run Code Online (Sandbox Code Playgroud)

结果是:

> command-line-arguments
> ./app.go:7: syntax error: unexpected .
Run Code Online (Sandbox Code Playgroud)

...基本上,因为go会自动插入;在一行的末尾.

任何人都知道有没有办法解决这个问题?

你可以禁用自动; 不知怎的?

或者这种api是不可能的?

amo*_*mon 14

您可以将代码重新格式化为

func main() {
    n.Log(":D").
    Example().
    Example
}
Run Code Online (Sandbox Code Playgroud)

将句点放在行尾可以避免自动分号插入 - 它只发生在标识符,文字或关闭parens/braces之后.

  • 这个语法很尴尬,因为乍一看并不清楚以下几行不仅仅是独立的语句,但我会接受它,因为这就是我正在寻找的〜 (2认同)