Нет, вы не должны ожидать увидеть все или ничего из обновленного конфига, если вы изменили его асинхронно.
Go пытается быть разумным (даже если это формально не гарантирует это); если вы обновите объект размером со слово в архитектуре, где обновления в размере слова не могут порваться, то вы увидите обновление или нет, даже если не синхронизируете. (Это отличается от C и C ++, где неопределенное поведение означает, что компилятор может законно делать что угодно). Но здесь Config
- это большое значение, и нет дешевого способа, которым go мог бы гарантировать обновление по принципу «все или ничего» (без выполнения какой-либо синхронизации).
Но да, вы должны использовать мьютекс для защиты конфига. Если есть слишком много споров, и вы не возражаете против старых конфигов на некоторое время, то вы можете периодически опрашивать официальную конфигурацию и обновлять локальную копию при ее изменении.
Прагматически, мьютексы быстрые, и это почти всегда лучше иметь правильный асин c -код, даже если он немного медленнее. Например, если у вас нет асинхронного c -корректного кода, вы не можете легко использовать детектор гонки для поиска других подлинных проблем, даже если ваш код ведет себя так, как вы хотите.