dongpo5207 2013-12-13 01:41
浏览 56
已采纳

指向结构的指针满足接口

I scanned the Revel framework's Go code and it seems that pointers satisfy interface requirements. See the snippets below.

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

What's the reasoning behind this? The framework is returning a struct value instead of a struct pointer for rendering JSON, though:

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

I can't seem to grasp the subtle (?) differences.

  • 写回答

3条回答 默认 最新

  • douguan8940 2013-12-13 02:14
    关注

    Any named type can satisfy an interface. It does not matter whether the type is a pointer, a channel or a function value as long as it implements the methods the interface demands.

    Example of a function satisfying an interface (play):

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

    This leaves the question why one would return a pointer rather than a value or vice versa. If you pass objects around all the time then it is a good idea to use pointers as they are always of a small fixed length instead of all the values.

    The following line results in having the struct copied to the caller:

    return RenderXmlResult{o}
    

    While this call will return a pointer to the struct placed somewhere in the heap.

    return &RenderXmlResult{o}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类