可以在go中编写“流利的”样式api吗? [重复]

This question already has an answer here:

Several other languages have a 'fluent' or chained-invokation style of api, which allows you to do calls like this:

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

Notable examples include fluent nhibernate, jquery method chaining, etc. It's a common (and I'd say quite well loved) api design pattern.

Problem: The go syntax doesn't seem to support this.

You can do this in go:

var blah = X().Y().Thing().OtherThing()

...but this:

package main

import "n"

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

Results in:

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

...basically, because go automatically inserts ;'s at the end of a line.

Anyone know if there's a way around this?

Can you disable the auto-; in a block somehow?

Or is this sort of api just not possible in go?

</div>

You can reformat your code to

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

Putting the period at the end of the line avoids automatic semicolon insertion—it only happens after identifiers, literals or closing parens/braces.

Have a look at goproxy. I think some part of it are fluent.

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