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