«Эта статья участвовала в мероприятии Haowen Convocation Order, щелкните, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!"
Файл конфигурации очень важен в проекте, особенно важно, как эффективно читать конфигурацию. Если вы не используете какую-либо стороннюю библиотеку, наиболее распространенным способом является получение содержимого файла через файловый ввод-вывод, но, в конце концов, я просто хочу прочитать файл конфигурации, который требует операций с файлами, т.е. немного колеса. Кроме того, существуют различные форматы файлов, и то, как читать содержимое файла в формате и читать его в соответствии с различными средами, также является большой проблемой. В этой статье я представляю четыре способа чтения файлов конфигурации, выберите в соответствии с вашими потребностями.
1. Введение в четыре метода чтения
Есть два выдающихся, в том числеViper
а такжеGoDotEnv
, аудитория этих двух методов достаточно широка,Viper
существуетGithub
В лучшем случае звезда, более полный документ,GoDotEnv
Следующий.另外还有两个比较小众轻量级的,包括gonfig
а такжеgo-akka
. Пожалуйста, обратитесь к отдельному введениюGithubпредставлять.
go-akka
Недоступен в данный момент! ! !
godotenv(Available)
A Go (golang) port of the Ruby dotenv project (which loads env vars from a .env file)
gonfig
gonfig is a lightweight Golang package for intergrating both JSON configs and enviornment variables into one config object.
viper(Available,Most stars)
Viper is heading towards v2 and we would love to hear what you would like to see in it.
Во-вторых, практика го-акка
конфигурационный файлconfig.yaml
port: 8081
debug: true
Разобрать конфигурациюconfig.go
import "github.com/go-akka/configuration"
type Config struct {
Port uint16 `yaml:"port"`
Debug bool `yaml:"debug"`
Raw *configuration.Config
}
func (c *Config) parseConfig(path string) *Config {
c.Raw = configuration.LoadConfig(path)
c.Port = uint16(c.Raw.GetInt32("port", 8008))
c.Debug = c.Raw.GetBoolean("debug", false)
return c
}
тестовое заданиеconfig_test.go
func TestConfig(t *testing.T) {
assert.NotPanics(t, func() {
cfg := new(Config).parseConfig("./cfg.yaml")
fmt.Printf(" port=%d,debug=%t", cfg.Port, cfg.Debug)
})
}
Три, годотенв практика
тестовый файл.env
Key1=value1
Key2 =value2
Разобрать конфигурациюconfig.go
func init() {
if err := godotenv.Load("./.env"); err != nil {
log.Fatal("Error loading .env file")
}
}
func ReadEnv() {
value1 := os.Getenv("Key1")
value2 := os.Getenv("Key2")
value3 := os.Getenv("Key3")
if value1 == "" || value2 == "" {
panic("load error")
}
fmt.Printf("key1=%s,key2=%s,key3=%s", value1, value2, value3)
}
тестовый файлconfig_test.go
func TestEnv(t *testing.T) {
assert.NotPanics(t, func() {
ReadEnv()
})
}
В-четвертых, практика гонфига
конфигурационный файл
dev_config.json
{
"DB_USERNAME": "test",
"DB_PASSWORD": "test",
"DB_PORT": "3306",
"DB_HOST": "127.0.0.1",
"DB_NAME": "test"
}
prd_config.json
{
"DB_USERNAME": "prd_test",
"DB_PASSWORD": "prd_test",
"DB_PORT": "3306",
"DB_HOST": "127.0.0.1",
"DB_NAME": "prd_test"
}
Разбор конфигурацииconfig.go
type Configuration struct {
DB_USERNAME string
DB_PASSWORD string
DB_PORT string
DB_HOST string
DB_NAME string
}
func ParseConfig(params ...string) Configuration {
configuration := Configuration{}
env := "dev"
if len(params) > 0 {
env = params[0]
}
fName := fmt.Sprintf("./%s_config.json", env)
if err := gonfig.GetConf(fName, &configuration); err != nil {
panic(err)
}
return configuration
}
тестовый файлconfig_test.go
func TestConfig(t *testing.T) {
assert.NotPanics(t, func() {
fmt.Println("Dev Conf :")
cfg := ParseConfig()
fmt.Printf("userName=%s,password=%s,port=%s,host=%s,name=%s \n", cfg.DB_USERNAME, cfg.DB_PASSWORD, cfg.DB_PORT, cfg.DB_HOST, cfg.DB_NAME)
cfg = ParseConfig("prd")
fmt.Printf("userName=%s,password=%s,port=%s,host=%s,name=%s \n", cfg.DB_USERNAME, cfg.DB_PASSWORD, cfg.DB_PORT, cfg.DB_HOST, cfg.DB_NAME)
})
}
Пять, змеиная практика
конфигурационный файлconfig.yml
server:
port: 8080
database:
dbname:
dbuser: "dbuser"
dbpassword: "dbpassword"
EXAMPLE_VAR: "variable from config.yml"
EXAMPLE_PATH: "path from config.yml"
Разобрать конфигурациюconfig.go
type Configurations struct {
Server ServerConfigurations
Database DatabaseConfigurations
EXAMPLE_PATH string
EXAMPLE_VAR string
}
// ServerConfigurations exported
type ServerConfigurations struct {
Port int
}
// DatabaseConfigurations exported
type DatabaseConfigurations struct {
DBName string
DBUser string
DBPassword string
}
func readConfig() {
viper.SetConfigName("config")
viper.AddConfigPath(".")
viper.AutomaticEnv()
viper.SetConfigType("yml")
var configuration Configurations
if err := viper.ReadInConfig(); err != nil {
fmt.Printf("Error reading config file, %s", err)
}
viper.SetDefault("database.dbname", "test_db")
err := viper.Unmarshal(&configuration)
if err != nil {
fmt.Printf("Unable to decode into struct, %v", err)
}
fmt.Printf("reading using model:\n database=%s,port=%d,path=%s,var=%s \n",
configuration.Database.DBName,
configuration.Server.Port,
configuration.EXAMPLE_PATH,
configuration.EXAMPLE_VAR)
fmt.Printf("reading without model:\n database=%s,port=%d,path=%s,var=%s \n",
viper.GetString("database.dbname"),
viper.GetInt("server.port"),
viper.GetString("EXAMPLE_PATH"),
viper.GetString("EXAMPLE_VAR"))
}
тестовый файлconfig_test.go
func TestConfig(t *testing.T) {
assert.NotPanics(t, func() {
readConfig()
})
}
6. Резюме
Четыре способа конфигурации среды чтения следует выбирать в соответствии с их собственной ситуацией.Рекомендуется использовать производственную среду.viper
а такжеgodotenv
, ведь закаляться гораздо надежнее, да и напоминания дружеские естьНикогда не забуду.gitignore
включите переменные среды в файл.
Брат, не паникуй! Не стесняйтесь оставлять лайки, обсуждать и комментировать. Добро пожаловать в колонку языка практикиgothing, учиться идти рука об руку. Также добро пожаловать, чтобы следовать за мной, я должен быть лучшим человеком.