Почему go стандартная библиотека предпочитает приемники указателей? - PullRequest
0 голосов
/ 14 апреля 2020

Существует ли причина, по которой 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 имел получатель значения.

Существует ли причина, по которой go стандарт библиотека неизменно отдает предпочтение указателям на приемники?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Существует ли причина, по которой go стандартная библиотека последовательно предпочитает приемники указателей

Нет.

Иногда это делается из соображений совместимости (например, потому что первая версия не работал на получателей стоимости). Иногда по причинам согласованности. Иногда это предпочтение автора. Здесь не так много, чтобы увидеть или узнать.

1 голос
/ 14 апреля 2020
Методы

multiWriter действительно могут пропускать указатели получателей, но поскольку MultiWriter возвращает интерфейс и интерфейсы в Go содержат только тип и указатель на данные , вам потребуется в любом случае отдельно выделять структуру.

Один интересный момент здесь заключается в том, что, насколько я могу судить, это деталь реализации, а не часть объекта c. Можно представить альтернативную реализацию Go, которая использует другое представление интерфейсов в памяти, потенциально позволяя небольшим структурам вписываться непосредственно в значения интерфейса без указателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...