Ответ 1
Является ли это глобальной переменной?
Да. Переменная определена на корневом уровне, что делает ее глобальной по всему пакету.
Однако это не глобальная переменная, которая хранит всю разумную информацию
пакета net/http
. Это просто настройка удобства, в которой используется
пакет net/http
, чтобы предоставить пользователю возможность быстрого запуска.
Это также означает, что это не добавляет много сложности.
Является ли это хорошей практикой или даже идиомой голанга?
IMO, это хорошая практика, чтобы помочь пользователю с использованием пакета. Если вы обнаружите, что можете некоторое время сохранить пользователя, предоставив хорошая настройка по умолчанию, сделайте это.
Однако вы должны быть осторожны, когда собираетесь экспортировать переменные.
Они должны быть готовы к параллельному доступу.
Например, DefaultServeMux
(или, лучше, базовый ServeMux
), с использованием мьютекса, является потокобезопасным.
Являются ли глобальные переменные всегда безопасными для потоков /goroutine в Go?
Нет. Без правильной синхронизации (мьютекс, канал,...) все, к которому обращаются одновременно, является проблематичным и, безусловно, будет бить все по кусочкам.
Я никогда не видел такой практики в других языках/стандартных библиотеках.
Модуль Python logging
, например, предоставляет функцию для восстановления корневого журнала, который может вызывать методы для настройки поведения ведения журнала. Это можно рассматривать как глобальный объект, поскольку он изменен и определен в модуле.