Configuration
环境变量
环境变量即软件运行环境中所需的一些参数。软件在运行过程中,需要一些必要的配置项,系统或者软件一般是用环境变量来实现的。
- 软件运行时所需要的路径指示。
- 软件运行时的环境类型。
- 软件运行中必要的配置。
OS
os是Go语言中针对操作系统的一个包,提供了Setenv、Getenv、LookupEnv、Unsetenv等方法操作环境变量。
package main
import (
"fmt"
"log"
"os"
)
func main() {
err := os.Setenv("APP_ENV", "development")
if err != nil {
log.Fatalf("Failed to set env: %s", err.Error())
return
}
// mode := os.Getenv("APP_ENV")
mode, ok := os.LookupEnv("APP_ENV")
if !ok {
log.Fatal("Failed to get env")
return
}
e := os.Unsetenv("APP_ENV")
if e != nil {
log.Fatal("Failed to remove env")
return
}
fmt.Println(mode)
}
Setenv设置环境变量。Getenv获取环境变量,但通过这种方式无法直接得到一个是否获取成功的结果。LookupEnv获取环境变量,这种方式不仅能够返回环境变量值,也能直接得知获取成功还是失败。Unsetenv删除环境变量。
配置文件
常用的配置文件有三种:
.env文件,专门给环境变量配置的文件类型。.json文件,专门给配置做集中管理的格式化文件。.yaml文件,书写格式比较简单的配置文件格式。
- app.env
- app.json
- app.yaml
APP_ENV = development
BASE_URL = http://localhost:8080/
{
"APP_ENV": "development",
"BASE_URL": "http://localhost:8080/"
}
APP_ENV: development
BASE_URL: http://localhost:8080/
database:
host: 127.0.0.1
port: 3306
user: root
password: 12345678
db_name: golang
godotenv
godotenv是一个加载配置文件的包,可加载.env和.yaml类型的文件。
go get github.com/joho/godotenv
- app.env
- app.yaml
- main.go
APP_ENV = development
BASE_URL: http://localhost:8080/
package main
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
err := godotenv.Load(
"./app.env",
"./app.yaml",
)
if err != nil {
log.Fatal("Failed to load env file")
return
}
mode, _ := os.LookupEnv("APP_ENV")
baseurl, _ := os.LookupEnv("BASE_URL")
fmt.Println(mode)
fmt.Println(baseurl)
}
godotenv.Read方法也可加载配置文件,并将其转换成map:
package main
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
env, err := godotenv.Read(
"./app.env",
"./app.yaml",
)
fmt.Println(env.APP_ENV)
fmt.Println(env.BASE_URL)
}
配置法
常量配置法
将所需的配置声明为常量,并形成一个单独的配置文件:
package config
const (
DBHost = "127.0.0.1"
DBPort = 3306
DBUser = "root"
DBPassword = "12345678"
DBName = "golang"
)
const (
GinHost = "127.0.0.1"
GinPort = "8080"
)
这种方式由于没有命名空间,通常需要通过前缀判断其作用。
映射表配置法
将配置以键值对的方式形成map,并通过命名空间进行访问:
var DB = map[string]any{
"HOST": "127.0.0.1",
"PORT": 3306,
"USER": "root",
"PASSWORD": "12345678",
"DBNAME": "golang",
}
// DB["HOST"]
但由于访问配置时需要使用到字符串,而配置类的程序通常不希望使用字符串。
flag.String
flag.String定义了一个具有指定名称、默认值和使用说明的字符串标志,可用此声明配置。
var DBHost = flag.String("DB_HOST", "127.0.0.1", "db host")
var DBPort = flag.String("DB_PORT", "3306", "db port")
var DBUser = flag.String("DB_USER", "root", "db user")
var DBPassword = flag.String("DB_PASSWORD", "12345678", "db password")
var DBName = flag.String("DB_NAME", "golang", "db name")
结构体配置法
将配置项声明为一个结构体,通过其类型声明一个配置结构体:
type DBConfig struct {
Host string
Port string
User string
Password string
Name string
}
var DB = DBConfig{
Host: "127.0.0.1",
Port: "3306",
User: "root",
Password: "12345678",
Name: "golang",
}
这种方式既有命名空间,也避免了字符串的访问形式,因此在Go语言中配置相关的程序中很常见。