Golang 学习笔记(三)- Golang 实现和 Laravel 类似的 .env 配置

在使用 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 这个包,觉得可以试一下,做一个记录。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 5

大神,能不能讲一讲怎么学习标准库

5年前 评论

@梦里曾经与画眉 我也不是大神,也是在学习中……

我是看的 https://github.com/astaxie/gopkg 这个标准库分析+示例,不过这个有些写的不太好或者不全,再看这个 https://studygolang.com/static/pkgdoc/main... ,然后对照这个去追踪源码,源码的注释比较全,再自己用一下试试,试验之后还不明白的就去 google 找专门解释的帖子。

5年前 评论

这个包做的事情,就是把你所设置的配置设置成系统环境变量。然后使用标准库的包 os 去读取系统环境变量。这样,程序在运行的时候,你的系统变量是谁都可以修改的。

5年前 评论

@bean 你说的是对的,这样是不安全的,我一般测试才用,即使是 Laravel 我也只在开发和测试环境才用 env 配置,正式环境我就把 env 去掉了

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!