龙空技术网

Golang中彻底解决相对路径与绝对路径不一致的问题

石老师小跟班 377

前言:

而今同学们对“路径不对怎么解决”可能比较注意,小伙伴们都需要分析一些“路径不对怎么解决”的相关资讯。那么小编也在网上汇集了一些有关“路径不对怎么解决””的相关文章,希望小伙伴们能喜欢,各位老铁们一起来学习一下吧!

你遇到过 go run main.go 或go build main.go 获取到的路径不一样的问题嘛?

1. 本节结构Go程序的两种执行方式两种方式下带来的问题产生不同结果的原因解决方案2. Go程序的两种执行方式第一种使用go run xx.go,常用于本地开发第二种使用go build xx.go 常用于生产环境,通过此命令构建成二进制文件然后上传到服务器再执行3. 两种方式下带来的问题使用go run 命令执行

func getCurrentAbPathByExecutable() string {	exePath, err := os.Executable()	if err != nil {		fmt.Print(err)	}	res, _ := filepath.EvalSymlinks(filepath.Dir(exePath))	return res}func main() {	curPath := getCurrentAbPathByExecutable()	fmt.Println(curPath)}// go run main.go 输出// tmp/go-build4104269073/b001/exe
使用go build 命令执行
func getCurrentAbPathByExecutable() string {	exePath, err := os.Executable()	if err != nil {		fmt.Print(err)	}	res, _ := filepath.EvalSymlinks(filepath.Dir(exePath))	return res}func main() {	curPath := getCurrentAbPathByExecutable()	fmt.Println(curPath)}// go build main.go 输出// /opt/go_code/demo/path
说明:可以看出,这两种不同的方式生成的路径 是不同的4. 产生不同路径的原因

这是由于go run会将源代码编译到系统TEMPTMP环境变量目录中并启动执行;而go build只会在当前目录编译出可执行文件,并不会自动执行。

5. 解决办法

使用 runtime.caller(0)来解决

 func getCurrentAbPathByExecutable() string {     var absPath string     _, file, _, ok := runtime.Caller(0)     if ok {         absPath = path.Dir(file)     }     return absPath } func main() {     curPath := getCurrentAbPathByExecutable()     fmt.Println(curPath) }

说明:

这样写的话,无论执行go run xx.go 或者 go build xx.go 返回的路径 都是一样的

标签: #路径不对怎么解决