簡體   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