Включение различий между различными средами выполнения непосредственно в двоичный файл приводит к ненужной сложности и неправильному распределению ответственности.

Рассмотрим следующий код, который ссылается на переменную среды, представляющую среду, и возвращает ключ API на ее основе:

package main

import (
 "os"
)

func main() {
 functionUsesAPIKey(getAPIKey())
}

func getAPIKey() string {
 switch os.Getenv("ENV") {
 case "PROD":
  return "XXXXX"
 case "DEV":
  return "XXXXX"
 default:
  panic("missing ENV")
 }
}

Этот подход имеет проблемы с переносимостью и ремонтопригодностью:

  • Если вы хотите запустить приложение в другой среде, вам нужно добавить еще один оператор case и перестроить его.
  • По мере добавления дополнительных сред сложность приложения возрастает.

Обязанности должны быть четко определены и разделены. Это делает код проще, легче для чтения и обслуживания.

Код должен быть рефакторинг следующим образом:

package main

import (
 "os"
)

func main() {
 functionUsesAPIKey(os.Getenv("API_KEY"))
}

Эта версия упрощает код. В то же время он делегирует ответственность за обработку различий в окружающей среде внешним инструментам или процессам.

Сохранение простоты кода и обеспечение четкого разграничения ответственности всегда является хорошей практикой.

P.S. Я знаю; Я оставил в стороне вопрос безопасности и сосредоточился на других.