指向结构的指针满足接口

卡尔

我扫描了Revel框架的Go代码,看来指针满足了接口要求。请参见下面的代码片段。

type Result interface {
    Apply(req *Request, resp *Response)
}

type RenderTextResult struct {
    text string
}

func (r RenderTextResult) Apply(req *Request, resp *Response) {
    resp.WriteHeader(http.StatusOK, "text/plain; charset=utf-8")
    resp.Out.Write([]byte(r.text))
}

func (c *Controller) RenderText(text string, objs ...interface{}) Result {
    finalText := text
    if len(objs) > 0 {
        finalText = fmt.Sprintf(text, objs...)
    }
    return &RenderTextResult{finalText}
}

这背后的原因是什么?不过,该框架会返回一个结构值而不是一个结构指针来呈现JSON,但:

type RenderJsonResult struct {
    obj      interface{}
    callback string
}

// Uses encoding/xml.Marshal to return XML to the client.
func (c *Controller) RenderXml(o interface{}) Result {
    return RenderXmlResult{o}
}

我似乎无法把握细微的差异。

尼莫

任何命名类型都可以满足接口。只要是实现接口要求的方法,类型是指针,通道还是函数值都没有关系。

满足接口功能的示例(播放):

type Printer interface {
    Print(string)
}

type funcPrinter func() string

func (f funcPrinter) Print(s string) { 
     fmt.Println(s + f()) 
}

这就留下了一个问题,为什么人们会返回一个指针而不是一个值,反之亦然。如果您一直在传递对象,则最好使用指针,因为指针总是固定长度的,而不是所有值的。

以下行导致将结构复制到调用方:

return RenderXmlResult{o}

虽然此调用将返回指向放置在堆中某处的结构的指针。

return &RenderXmlResult{o}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章