Вопрос по go – Считается ли использование «net / http» глобальных переменных хорошей практикой в golang?

16

Пакет golang «net / http» использует глобальную переменную DefaultServeMux для регистрации обработчиков. Это считается хорошей практикой или даже идиомой голанга? В конце концов, это глобальная переменная?

Две основные причины не использовать глобальные переменные - AFAIK 1), что они добавляют сложности и 2) проблематично в параллельных программах.

Может быть, 1) не считается важным в этом случае, потому что разработчик может не использовать DefaultServerMux? Как насчет 2)? Являются ли глобальные переменные всегда безопасными для работы с потоками / программами в Go? Тем не менее, я удивлен, что он используется в стандартной библиотеке Go. Я никогда не видел такой практики в других языках / стандартных библиотеках.

Ваш Ответ

2   ответа
22

Is it a global variable after all?

Да. Переменнаяопределенный на корневом уровне, что делает его глобальным во всем пакете.

Тем не менее, это не глобальная переменная, которая хранит всю разумную информацию изnet/http пакет. Это просто удобная настройка, которая использует содержание net/http пакет, чтобы предоставить пользователю возможность быстрого запуска. Это также означает, что это не добавляет много сложности.

Is this considered a good practice or even an golang idiom?

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

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

Are global variables always thread/goroutine safe in Go?

Нет. Без правильной синхронизации (мьютекс, канал, ...) все, к чему происходит одновременный доступ, является проблематичным и наверняка разнесет все на кусочки.

I've never seen such practice in other languages / standard libraries.

Python & APOS; slogging Модуль, например, предоставляет функцию для извлечения корневого объекта ведения журнала, с помощью которого можно вызывать методы для настройки поведения ведения журнала. Это можно рассматривать как глобальный объект, так как он изменчив и определен в модуле.

1

В этом случае глобвар является таким же безопасным и хорошим выбором, как и аналог, например, в пакете «log». является.

Таким образом, утверждение 1 настолько расплывчато, насколько это возможно, а утверждение 2 ограничено: когда-то / где-то истина, в противном случае false == в общем случае не выполняется, даже если используется именно так.

Похожие вопросы