Разделение среды разработки и производства в GOLANG

Я новичок в программировании GO. Я пришел из nodejs. В nodejs было легко разделить режим разработки и производства. Просто используя этот код.

if (process.env.NODE_ENV== = "production"){
   server.listen(prod.port);
} 
else{
   server.listen(dev.port);
}

Я в основном хочу, чтобы это соглашение использовалось и в GO. Итак, как я могу разделить свой код разработки и производственный код.

Причина, по которой нужна эта функция:

to separate the port my server is listening in dev and prod environment

Если есть какой-либо способ разделения порта, он тоже сработает.

P.S: I am using VScode as my code editor. And go-iris as a go server framework

В идеале вы не должны делать это таким образом, потому что это приведет к множеству дублирования. На самом деле нет особых причин переключаться между подобными средами, поэтому вы просто пишете один и тот же код снова и снова. Используйте 1 env и все. Измените env, чтобы он соответствовал env, а не код, чтобы он соответствовал env

Derek Pollard 10.08.2018 08:10

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

Derek Pollard 10.08.2018 08:12
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
10
2
6 504
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вы можете использовать функцию os.Getenv.

package main

import (
    "fmt"
    "os"
)

func getEnv() string{
    return os.Getenv("APP_ENV")
}

https://golang.org/src/os/env.go?s=2471:2501#L73

Используемая та же функция путем присвоения переменной, такой как port:=os.Getenv("APP_ENV"), не работала, но при использовании напрямую с if os.Getenv("APP_ENV")= = "production"{ // } работала

Raju Adhikari 10.08.2018 08:31

вы можете пропустить часть кода, использующего port?

whitespace 10.08.2018 10:00

Я не понял тебя, ты имеешь в виду каст или прошлое

Raju Adhikari 10.08.2018 10:19

извините, я имел ввиду * вставить. Я не понимаю, почему переменная port не должна хранить строковое значение. Если вы покажете мне проблемную часть (вашего кода), я, возможно, смогу улучшить ответ.

whitespace 10.08.2018 10:53

извините, это была переменная env, а не portenv:=os.Getenv("APP_ENV"); if env= = "production"{ }else{ }

Raju Adhikari 10.08.2018 11:12
if env := os.Getenv("APP_ENV"); env != "" { fmt.Println(os.Getenv("APP_ENV")) } у меня работает.
whitespace 10.08.2018 11:23

Есть несколько способов добиться этого в Go, но все они не учитывают это в самом коде.

  1. Используйте переменные среды, например os.Getenv
  2. Разобрать файлы конфигурации, например, какой-то файл .yaml
  3. Используйте флаги, например package flag

Я думаю, что наиболее распространенным решением является использование флагов, но все они выполняют одну и ту же работу. Обычно вы разбираете свои флаги в основном методе.

Да! Это идеальный вариант. А если не основной, то точно init() - особенно при разборе разных флагов в разных пакетах

Derek Pollard 10.08.2018 08:19

Или вы можете использовать все 3, плюс жестко заданные значения по умолчанию, в любом порядке приоритета, если вы выберете его вручную, или вы можете использовать что-то вроде github.com/spf13/viper, чтобы сделать это за вас.

Adrian 10.08.2018 15:47

Другие вопросы по теме