繁体   English   中英

指向struct的指针满足接口

[英]Pointer to struct satisfy interface

我扫描了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}
}

这背后的原因是什么? 该框架返回一个struct值而不是一个用于呈现JSON的struct指针,但是:

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

我似乎无法掌握细微的(?)差异。

是的,指针隐含地具有它们指向的类型的所有方法。 请参阅常见问题解答部分“为什么T和* T有不同的方法集?” “关于价值观或指针的方法?”

与类型相关联的方法也可用于指向该类型的指针。 因此,如果r*RenderTextResult变量,则r.Apply(...)等效于(*r).Apply()

在大多数方面, Apply方法将像任何与*RenderTextResult直接关联的方法一样,虽然它无法修改结构的内容,因为它接收结构的副本而不是指向原始的指针。

这意味着RenderTextResult上的方法可用于让*RenderTextResult满足Result接口。

任何命名类型都可以满足接口。 只要它实现了接口所需的方法,类型是指针,通道还是函数值都无关紧要。

满足接口( 播放 )的函数示例:

type Printer interface {
    Print(string)
}

type funcPrinter func() string

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

这就留下了一个问题,即为什么会返回一个指针而不是一个值,反之亦然。 如果你一直传递对象,那么使用指针是个好主意,因为它们总是一个小的固定长度而不是所有的值。

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

return RenderXmlResult{o}

虽然这个调用将返回一个指向放在堆中某处的struct的指针。

return &RenderXmlResult{o}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM