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

时间:2013-04-19 08:21:35

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

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

问题:go语法似乎不支持此功能。

您可以在go:

中执行此操作
var blah = X().Y().Thing().OtherThing()

......但是这个:

package main

import "n"

func main() {
    n.Log(":D")
    .Example()
    .Example
}

结果:

> command-line-arguments
> ./app.go:7: syntax error: unexpected .

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

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

你可以禁用自动;不知何故在一个街区?

或者这种api是不可能的?

2 个答案:

答案 0 :(得分:13)

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

func main() {
    n.Log(":D").
    Example().
    Example
}

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

答案 1 :(得分:-2)

看看goproxy。我认为它的某些部分是流利的。

proxy.OnRequest(goproxy.DstHostIs("www.reddit.com")).DoFunc(
    func(r *http.Request,ctx *goproxy.ProxyCtx)(*http.Request,*http.Response) {
        if h,_,_ := time.Now().Clock(); h >= 8 && h <= 17 {
            return r,goproxy.NewResponse(r,
                    goproxy.ContentTypeText,http.StatusForbidden,
                    "Don't waste your time!")
        }
        return r,nil
})