Go标准库偏爱指针接收器(即使值接收器可以工作的地方),这是否有原因吗?

例如,在go 1.14 io.multiwriter中:

type multiWriter struct {
    writers []Writer
}

func (t *multiWriter) Write(p []byte) (n int, err error) {
...
}

...
func MultiWriter(writers ...Writer) Writer {
...
   return &multiWriter{allWriters}
}

即使函数返回&multiWriter{allWriters}值而不是multiWriter,并且func (t *multiWriter) Write具有值接收器,这也将起作用。

为什么标准库始终偏爱指针接收器?

最佳答案

multiWriter的方法确实可以跳过指针接收器,但是由于MultiWriter返回一个接口(interface),而Go中的接口(interface)仅包含type and a pointer to the data,因此无论如何您都需要单独分配一个结构。

据我所知,这里有趣的一点是,这是实现细节,而不是the spec的一部分。可以想象一个替代的Go实现,它使用内存中接口(interface)的不同表示形式,可能允许小的结构直接适合接口(interface)值而无需使用指针。

10-01 12:33