zl程序教程

您现在的位置是:首页 >  其它

当前栏目

DotEnv 中 $ 的坑

2023-06-13 09:13:55 时间

结论

总的来说,下面的这份 .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

解决方案

还得是反斜杠。把密码改成@gP\$0^&N,输出就正常了。

但是我实际的解决方案更简单粗暴:把 $ 从密码里删掉,一劳永逸。