Golang 实现和 Laravel 类似的 .env 配置

作者: BroQiang

发布于 2018-06-24 | 最后更新 2018-06-24


在使用 Laravel 的时候,会觉得它是优雅的,可能 Golang 主要的领域不是在 Web 开发中,也可能是它还太年轻,没有发现一个像 Laravel 一样优雅的框架,有一些以前用 Laravel 保留下的习惯,现在没有就会觉得很别扭。

Laravel 的 .env 配置很方便,可以通过这个配置,来设置本地和服务器端使用不同的配置,Golang 可以通过 godotenv 来实现和这个差不多的功能。

在根目录下创建一个 .env 文件,在里面写入

PORT=8888

这里只是定义一个端口号,用来简单的说明下怎么使用。

然后创建一个 main.go 文件

package main

import (
	"flag"

	"log"

	"os"

	"net/http"

	"fmt"

	"github.com/joho/godotenv"
)

var port string

func init() {
	// 可以在命令行启动服务的时候通过 -port=端口号 ,来指定 web 服务的端口号
	// 如果没有指定会使用默认的 8080
	flag.StringVar(&port, "port", "8080", "The server listening port")
	flag.Parse()

	// 正常情况下会使用上面的端口号,可以通过 .env 中的配置来对端口号进行替换
	// 初始化 .env 的配置,将 .env 中的配置加载到 Go 的 env 环境中
	if err := godotenv.Load(".env"); err != nil {
		log.Fatalln(err)
		os.Exit(1)
	}

	// 可以通过 os 包的 Getenv 获取到 .env 中配置的端口号
	envPort := os.Getenv("PORT")
	// 如果 env 里面配置了,使用 env 的,如果没有配置,仍然使用默认的
	if len(envPort) > 0 {
		port = envPort
	}
}

func Hello(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "text/html;charset=utf8")
	w.Write([]byte("<h1>Hello World</h1>"))
}

func main() {
	http.HandleFunc("/", Hello)

	log.Printf("Starting server on localhost:%s ...", port)

	log.Fatalln(
		http.ListenAndServe(
			fmt.Sprintf("localhost:%s", port), nil))
}

通过上面的示例,就可以看到,原本默认的端口是命令行输入的或者默认的 8080 端口,不过读取了 .env 配置文件后就被替换成了 .env 中的 8888 端口。

是不是有点像 Laravel 了,一般项目会有一个专门处理配置文件的包或文件,在里面再将它封装一下就很方便了。不过会不会影响性能还没有测试过,今天突然发现了 godotenv 这个包,觉得可以试一下,做一个记录。