Нужно ли возвращать тип указателя в sync.Pool Новая функция? - PullRequest
0 голосов
/ 14 января 2019

Я видел проблему на Github, которая говорит, что sync.Pool должен использоваться только с типами указателей, например:

var TPool = sync.Pool{
    New: func() interface{} {
       return new(T)
    },
}

Имеет ли это смысл? Что насчет return T{} и какой выбор лучше, почему?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Весь смысл sync.Pool состоит в том, чтобы избежать (дорогих) выделений. Буферы большого размера и т. Д. Вы выделяете несколько буферов, и они остаются в памяти, доступной для повторного использования. Отсюда и использование указателей.

Но здесь вы будете копировать значения на каждом шаге, побеждая цель. (Предполагая, что ваша T является "нормальной" структурой, а не чем-то вроде SliceHeader)

0 голосов
/ 14 января 2019

Это не обязательно. В большинстве случаев это должен быть указатель, если вы хотите поделиться объектом, а не делать копии.

В некоторых случаях это может быть не указатель типа, например идентификатор некоторого внешнего ресурса. Я могу представить пул путей (подключенных дисков), представленных строками, в которых выполняются некоторые большие файловые операции.

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