我扫描了 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}}我似乎无法掌握细微的(?)差异。
2 回答
慕码人8056858
TA贡献1803条经验 获得超6个赞
与类型关联的方法也可用于指向该类型的指针。所以如果r
是一个*RenderTextResult
变量,那么r.Apply(...)
就等价于(*r).Apply()
。
在大多数方面,该Apply
方法将像任何*RenderTextResult
直接关联的方法一样工作,尽管它不能修改结构的内容,因为它接收结构的副本而不是指向原始结构的指针。
这意味着RenderTextResult
可以使用on 方法来*RenderTextResult
满足Result
接口。
- 2 回答
- 0 关注
- 185 浏览
添加回答
举报
0/150
提交
取消