猿问

指向结构体满足接口的指针

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

}

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


波斯汪
浏览 186回答 2
2回答

慕码人8056858

与类型关联的方法也可用于指向该类型的指针。所以如果r是一个*RenderTextResult变量,那么r.Apply(...)就等价于(*r).Apply()。在大多数方面,该Apply方法将像任何*RenderTextResult直接关联的方法一样工作,尽管它不能修改结构的内容,因为它接收结构的副本而不是指向原始结构的指针。这意味着RenderTextResult可以使用on 方法来*RenderTextResult满足Result接口。
随时随地看视频慕课网APP

相关分类

Go
我要回答