Skip to main content

Configuration

环境变量

环境变量即软件运行环境中所需的一些参数。软件在运行过程中,需要一些必要的配置项,系统或者软件一般是用环境变量来实现的。

  1. 软件运行时所需要的路径指示。
  2. 软件运行时的环境类型。
  3. 软件运行中必要的配置。

OS

os是Go语言中针对操作系统的一个包,提供了SetenvGetenvLookupEnvUnsetenv等方法操作环境变量。

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 删除环境变量。

配置文件

常用的配置文件有三种:

  1. .env文件,专门给环境变量配置的文件类型。
  2. .json文件,专门给配置做集中管理的格式化文件。
  3. .yaml文件,书写格式比较简单的配置文件格式。
APP_ENV = development
BASE_URL = http://localhost:8080/

godotenv

godotenv是一个加载配置文件的包,可加载.env.yaml类型的文件。

go get github.com/joho/godotenv
APP_ENV = development

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语言中配置相关的程序中很常见。