- Создать единый log.Logger и передать его?
Это возможно. Log.Logger может использоваться одновременно из нескольких goroutines.
- Передать указатель на этот журнал.
log.New возвращает a, *Logger
который обычно указывает на то, что вы должны передать объект как указатель. Передача его в качестве значения создаст копию структуры (т.е. копию Logger), а затем несколько горутин могут одновременно писать в один и тот же io.Writer . Это может быть серьезной проблемой, в зависимости от реализации писателя.
- Должна ли каждая горутина или функция создавать регистратор?
Я бы не стал создавать отдельный логгер для каждой функции или горутины. Горутины (и функции) используются для очень легких задач, которые не оправдывают обслуживание отдельного регистратора. Вероятно, будет хорошей идеей создать регистратор для каждого более крупного компонента вашего проекта. Например, если ваш проект использует службу SMTP для отправки писем, создание отдельного регистратора для почтовой службы кажется хорошей идеей, так что вы можете фильтровать и отключать вывод отдельно.
- Должен ли я создавать регистратор как глобальную переменную?
Это зависит от вашего пакета. В предыдущем примере почтовой службы, вероятно, было бы хорошей идеей иметь по одному регистратору для каждого экземпляра вашей службы, чтобы пользователи могли регистрировать сбои при использовании почтовой службы gmail иначе, чем сбои, которые произошли при использовании локального MTA (например, sendmail ).