1、Golang 获取系统环境变量
Golang 要获取系统的环境变量需要导入"os"包,通过os包中的Getenv方法来获取。
func Getenv(key string) string { }
示例代码:
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getenv("GOPATH")) }
2、通过godotenv库配置环境变量
2.1 简介
.envgodotenv
2.2 快速使用
第三方库需要先安装:
go get github.com/joho/godotenv
后使用:
package main import ( "fmt" "log" "os" "github.com/joho/godotenv" ) func main() { err := godotenv.Load() if err != nil { log.Fatal(err) } fmt.Println("name: ", os.Getenv("name")) fmt.Println("age: ", os.Getenv("age")) }
.env
name = zmc age = 20
运行程序,输出:
name: zmc age: 20
godotenv.envkey = valuegodotenv.Load()os.Getenv("key")
2.3 高级特性
自动加载
Loadgithub.com/joho/godotenv/autoload
package main import ( "fmt" "os" _ "github.com/joho/godotenv/autoload" ) func main() { fmt.Println("name: ", os.Getenv("name")) fmt.Println("age: ", os.Getenv("age")) }
godotenv_
autoloadLoad
// src/github.com/joho/godotenv/autoload/autoload.go package autoload /* You can just read the .env file on import just by doing import _ "github.com/joho/godotenv/autoload" And bob's your mother's brother */ import"github.com/joho/godotenv" func init() { godotenv.Load() }
加载自定义文件
.env.env
package main import ( "fmt" "log" "os" "github.com/joho/godotenv" ) func main() { err := godotenv.Load("common", "dev.env", "production.env") if err != nil { log.Fatal(err) } fmt.Println("name: ", os.Getenv("name")) fmt.Println("version: ", os.Getenv("version")) fmt.Println("database: ", os.Getenv("database")) }
common
name = awesome web version = 0.0.1
dev.env文件内容
database = sqlite
production.env文件内容
database = mysql
运行结果:
name: awesome web version: 0.0.1 database: sqlite
Load.envdatabase
注释
.env#
# app name name = awesome web # current version version = 0.0.1
YAML
.env
name: awesome web version: 0.0.1
不存入环境变量(重要)
godotenv.envgodotenv.Read()map[string]string
package main import ( "fmt" "log" "github.com/joho/godotenv" ) func main() { var myEnv map[string]string myEnv, err := godotenv.Read() if err != nil { log.Fatal(err) } fmt.Println("name: ", myEnv["name"]) fmt.Println("version: ", myEnv["version"]) }
输出:
name: awesome web version: 0.0.1
map
数据源
string、io.Readerio.Reader
package main import ( "fmt" "log" "github.com/joho/godotenv" ) func main() { content := ` name: awesome web version: 0.0.1 ` myEnv, err := godotenv.Unmarshal(content) if err != nil { log.Fatal(err) } fmt.Println("name: ", myEnv["name"]) fmt.Println("version: ", myEnv["version"]) }
输出:
name: awesome web version: 0.0.1
io.Readeros.Filenet.Connbytes.Buffer
package main import ( "bytes" "fmt" "log" "os" "github.com/joho/godotenv" ) func main() { file, _ := os.OpenFile(".env", os.O_RDONLY, 0666) myEnv, err := godotenv.Parse(file) if err != nil { log.Fatal(err) } fmt.Println("name: ", myEnv["name"]) fmt.Println("version: ", myEnv["version"]) buf := &bytes.Buffer{} buf.WriteString("name: awesome web @buffer") buf.Write([]byte{'\n'}) buf.WriteString("version: 0.0.1") myEnv, err = godotenv.Parse(buf) if err != nil { log.Fatal(err) } fmt.Println("name: ", myEnv["name"]) fmt.Println("version: ", myEnv["version"]) }
输出:
name: awesome web version: 0.0.1 name: awesome web @buffer version: 0.0.1
io.ReaderUnmarshalParse
.env
.env
package main import ( "bytes" "log" "github.com/joho/godotenv" ) func main() { buf := &bytes.Buffer{} buf.WriteString("name = awesome web") buf.WriteByte('\n') buf.WriteString("version = 0.0.1") env, err := godotenv.Parse(buf) if err != nil { log.Fatal(err) } err = godotenv.Write(env, "./.env") if err != nil { log.Fatal(err) } }
.env
name="awesome web" version="0.0.1"
还可以返回一个字符串:
package main import ( "bytes" "fmt" "log" "github.com/joho/godotenv" ) func main() { buf := &bytes.Buffer{} buf.WriteString("name = awesome web") buf.WriteByte('\n') buf.WriteString("version = 0.0.1") env, err := godotenv.Parse(buf) if err != nil { log.Fatal(err) } content, err := godotenv.Marshal(env) if err != nil { log.Fatal(err) } fmt.Println(content) }
输出:
name="awesome web" version="0.0.1"
命令行模式
godotenv
godotenv -f ./.env command args
go getgodotenvgodotenv$GOPATH/bin$GOPATH/binPATHgodotenv
-f.env
我们简单写一个程序验证一下:
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getenv("name")) fmt.Println(os.Getenv("version")) }
godotenv
godotenv -f ./.env go run main.go
输出:
awesome web 0.0.1
多个环境
APP_ENV
package main import ( "fmt" "log" "os" "github.com/joho/godotenv" ) func main() { env := os.Getenv("GODAILYLIB_ENV") if env == "" { env = "development" } err := godotenv.Load(".env." + env) if err != nil { log.Fatal(err) } err = godotenv.Load() if err != nil { log.Fatal(err) } fmt.Println("name: ", os.Getenv("name")) fmt.Println("version: ", os.Getenv("version")) fmt.Println("database: ", os.Getenv("database")) }
GODAILYLIB_ENV.env..env
.env.env.development/.env.test/.env.production
.env
name = awesome web version = 0.0.1 database = file
.env.development文件内容:
database = sqlite3
.env.production文件内容:
database = mysql
运行程序:
# 默认是开发环境 $ go run main.go name: awesome web version: 0.0.1 database: sqlite3 # 设置为生产环境 $ GODAILYLIB_ENV=production go run main.go name: awesome web version: 0.0.1 database: mysql
2.4 一点源码
godotenvos.Getenv
// src/github.com/joho/godotenv/godotenv.go func loadFile(filename string, overload bool) error { envMap, err := readFile(filename) if err != nil { return err } currentEnv := map[string]bool{} rawEnv := os.Environ() for _, rawEnvLine := range rawEnv { key := strings.Split(rawEnvLine, "=")[0] currentEnv[key] = true } for key, value := range envMap { if !currentEnv[key] || overload { os.Setenv(key, value) } } returnnil }
godotenvos.Setenv