结论
总的来说,下面的这份 .env
中的 C
会被解析为 xymn
:
A=xy
B=mn
C=$A$B
用 $
后面跟着变量名会访问到之前定义的变量。
介绍
最近写后端,觉得还得是 Go
比某些语言吃的资源少(都说到这个份上了就不用点名了吧),我这小服务器 RAM
一共就 1G,还是要省着点用的。
项目中有一些敏感数据,例如数据库密码,直接写死在代码中肯定是下策。那么这时使用 .env
文件是一种不错的解决方案。
当然,通过其名也不难猜到它的作用主要是当作配置文件。
在 Go 中使用
自然是有现成的包供我们调用的:godotenv
安装:
go get github.com/joho/godotenv
在项目根目录下写一个 .env
文件:
PASSWORD=super_secret_password
这里我直接用自动导入了,更多的使用方式请参考文档:
package main
import (
"fmt"
"os"
_ "github.com/joho/godotenv/autoload"
)
func main() {
fmt.Printf("PASSWORD: %s\n", os.Getenv("PASSWORD"))
}
目前为止是没有问题的。
$ 符造成的问题
我用的一个自动生成的复杂密码,例如 @gP$0^&N
,这个是我现打出来的,不是我的任何密码,还请放心。
但当我把这个东西放到 .env
文件里的时候,原来的程序就报错了,说是密码错误,打印出来一看是:
PASSWORD: @gP^&N
它直接把我的 $0
吃掉了,把我坑死了。因为原来的那个密码更长,乍一看看不出来其实是有区别的。
即使你加上双引号,即 "@gP$0^&N"
,最终的结果还会把 $0
吃掉。
解决方案
还得是反斜杠。把密码改成@gP\$0^&N
,输出就正常了。
但是我实际的解决方案更简单粗暴:把 $
从密码里删掉,一劳永逸。