场景
项目根目录存在一个config文件夹,其中包含config.go和config.json
config.go中需要读取config.json文件内容,反序列化到结构体
这时最好的做法就是获取这个config.json文件的绝对路径,避免运行测试出现找不到文件的错误
三种方式
package config
import (
"fmt"
"os"
"runtime"
)
func Init() {
// 第一种
// 输出的是运行可执行文件时的目录
// 比如当前项目可执行文件位置是D:\dev\project\golang\go-demo\go-demo.exe
// 在D:\dev\project\golang\go-demo\目录下执行go-demo.exe,获取的是D:\dev\project\golang\go-demo
// 而在D:\dev\project\golang\下执行go-demo\go-demo.exe,获取的是D:\dev\project\golang\
dir, err := os.Getwd()
if err != nil {
panic(err)
}
fmt.Println("config wd", dir)
// 第二种
// 这种方式在使用go run, Goland点击运行,得到的是临时目录
// 在开发时很不方便
arg0 := os.Args[0]
fmt.Println("config arg0", arg0)
// 第三种
// 这种就比较稳定通用
// 固定为当前的文件,可以通过两次path.Dir获得项目根目录
_, file, _, _ := runtime.Caller(0)
fmt.Println("runtime", file)
}
测试
执行根目录下可执行文件
config wd D:\dev\project\golang\go-demo
config arg0 C:\Users\yimin\AppData\Local\JetBrains\GoLand2024.1\tmp\GoLand\___go_build_go_demo.exe
runtime D:/dev/project/golang/go-demo/config/config.go
执行config文件夹下的config_test.go中的Test方法
config wd D:\dev\project\golang\go-demo\config
config arg0 C:\Users\yimin\AppData\Local\JetBrains\GoLand2024.1\tmp\GoLand\___TestDir_in_go_demo_config.test.exe
runtime D:/dev/project/golang/go-demo/config/config.go
比较两次输出,通过runtime.Caller获取的路径保持不变