Golang Go语言路径问题
go 新手遇到一个问题,初始化的时候需要加载一个配置文件,这个配置文件在 项目文件夹的 conf 文件下,运行 main.go 是没有问题的,但是如果我执行项目文件夹 task 文件下一个文件的单元测试,就会导致当前成程序的运行路径变为 task, 而 task 和 conf 是平级的当然也就没办法找到配置路径了。
- 不希望在代码里面手写绝对路径
- 尝试使用 os.Args[0] 以及 os.Executable() 去获取路径,但发觉执行单元测试的时候这个路径也不是项目路径,而是一个 APP/LOCAL 里面的一个路径
- 最丑陋的方法是判断特定的字符串,然后再处理,但我不想这么做
请教各位大佬
Golang Go语言路径问题
更多关于Golang Go语言路径问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你这还是 python 的思路吧
golang 建议开始考虑放弃配置文件
如果是写类似 caddy 这样的本机服务,去学习一下它按照优先级读取本机各路径配置的方法。
但大部分时候都是写 web 服务吧。现在流行用环境变量配置或者用专门的配置管理服务做配置。
都是方便未来集群部署的。
docker 的最佳实践也是用环境变量配置。12factor 也是推荐环境变量的。
func GetCurrentPath() string {
, curPath, , _ := runtime.Caller(0)
return curPath
}
相当于 python 的__file
这样做应该是获取当前执行这个方法文件的路径 还是要把路径修改一下的
同一楼,也是写绝对路径解决的,获取项目的文件夹名再拼接的。
你们的意思通过 cur, _ = filepath.Abs(’.’) 去获取绝对路径 然后再去拼接?
这样执行 main.go 和 执行单元测试的路径是不一样的,就如我上面所说的,执行 mian.go 路径是项目路径,执行单元测试就变成 task 了
os.Getwd() 用这个函数获取当前的路径,判断里面有没有根目录的文件夹名字[缺点 不能有子文件夹和根目录字句一样]
当前路径获取两次可能不一样 我想有没有可能只获取项目的绝对路径
用命令行指定呢,而且测试和线上用一个配置文件不好吧。
同一个目录 ,获取多次是一样的吧,你在什么情况下有遇到获取两次不一样的情况。
上面有说过啊 直接执行根路径下的 main.go 以及 task 文件下一个文件的单元测试
这不是根目录和子目录么。。
dirName, _ := os.Getwd()
endIndex := strings.Index(dirName, “项目文件夹名”)
configPath := ""
if endIndex > 0 {
configPath = dirName[:endIndex] + “项目文件夹名 /”
}
toml.LoadFile(configPath + “./config.toml”)
是的,我在最开始就说过这个是最后的解决方案。。。。
我的做法是从 env 拿配置文件绝对路径,然后各种执行时带上 env 参数