6

其他几种语言具有“流利”或链式调用风格的 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);
  }
}

值得注意的例子包括 fluent nhibernate、jquery 方法链接等。它是一种常见的(我会说非常受欢迎的)api 设计模式。

问题: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 在 go 中是不可能的?

4

2 回答 2

15

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

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

将句点放在行尾可以避免自动插入分号——它只发生在标识符、文字或右括号/大括号之后。

于 2013-04-19T08:40:59.387 回答
-3

看看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
})
于 2013-04-21T13:40:19.080 回答