我扫描了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] 删除。
我来说两句