go run 命令无法识别同路径下非go文件、go build可正常运行的原因是什么?
问题原因
核心差异在于go run和go build的运行逻辑不同:
go build会在当前执行命令的目录生成可执行二进制文件,运行该二进制时,os.Args[0]为当前目录下的二进制文件路径,因此filepath.Dir(os.Args[0])取到的是项目根目录,拼接dev.env后路径正确,可正常加载配置。go run会先将代码编译为临时二进制文件,存储在系统临时目录(如Linux下的/tmp/go-buildXXX、Windows下的%TEMP%\go-buildXXX)后再运行,此时os.Args[0]指向的是临时目录下的二进制文件,拼接dev.env后会在临时目录下查找配置文件,而你的dev.env存放在项目根目录,自然找不到对应文件,加载失败。
另外你代码中直接忽略了godotenv.Load的返回错误,所以加载失败时不会有任何提示,也放大了问题排查的难度。
修复方案
如果需要同时兼容go run和go build后直接运行的场景,可采用以下方案:
- 若固定在项目根目录执行命令,直接写
godotenv.Load("dev.env")即可,不需要通过二进制路径拼接配置文件路径,默认读取当前工作目录下的对应文件。 - 若需要支持任意目录执行,可通过启动参数传入配置文件路径、或读取系统约定的配置目录(如
/etc/XXX/、~/.config/XXX/)的方式定位配置文件,避免依赖二进制文件所在路径。
内容的提问来源于stack exchange,提问作者zer0
相关产品推荐
相关产品推荐

