Я новичок в программировании 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
Особенно учитывая массивные готовые инструменты разработки, которые встроены в GO, вам действительно не нужен дублированный код жестко запрограммированной среды.
вы можете использовать функцию 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"{ // }
работала
вы можете пропустить часть кода, использующего port
?
Я не понял тебя, ты имеешь в виду каст или прошлое
извините, я имел ввиду * вставить. Я не понимаю, почему переменная port
не должна хранить строковое значение. Если вы покажете мне проблемную часть (вашего кода), я, возможно, смогу улучшить ответ.
извините, это была переменная env
, а не port
env:=os.Getenv("APP_ENV"); if env= = "production"{ }else{ }
if env := os.Getenv("APP_ENV"); env != "" { fmt.Println(os.Getenv("APP_ENV")) }
у меня работает.
Есть несколько способов добиться этого в Go, но все они не учитывают это в самом коде.
os.Getenv
.yaml
package flag
Я думаю, что наиболее распространенным решением является использование флагов, но все они выполняют одну и ту же работу. Обычно вы разбираете свои флаги в основном методе.
Да! Это идеальный вариант. А если не основной, то точно init()
- особенно при разборе разных флагов в разных пакетах
Или вы можете использовать все 3, плюс жестко заданные значения по умолчанию, в любом порядке приоритета, если вы выберете его вручную, или вы можете использовать что-то вроде github.com/spf13/viper, чтобы сделать это за вас.
В идеале вы не должны делать это таким образом, потому что это приведет к множеству дублирования. На самом деле нет особых причин переключаться между подобными средами, поэтому вы просто пишете один и тот же код снова и снова. Используйте 1 env и все. Измените env, чтобы он соответствовал env, а не код, чтобы он соответствовал env