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)值而无需使用指针。