golang 基础库之go获取命令行参数,介绍了如何获取当前工作目录
获取当前工作目录
Golang 版本
1.12.1
前言
应用的另一个有用的信息是程序二进制文件所在的目录。使用此信息,程序可以快速获取到相关的资源文件的路径。
实现
package main
import (
"fmt"
"os"
"path/filepath"
)
func main(){
ex,err:=os.Executable()
if err!=nil{
panic(err)
}
// 可执行文件的路径
fmt.Println(ex)
// 获取执行文件所在目录
exPath := filepath.Dir(ex)
fmt.Println("可执行文件路径 :" + exPath)
// 使用EvalSymlinks获取真是路径
realPath, err := filepath.EvalSymlinks(exPath)
if err != nil {
panic(err)
}
fmt.Println("符号链接真实路径:" + realPath)
}
- 编译二进制文件
go build -o build/binary
- 创建build文件夹的软连接buid2
ln -s build build2
- 执行
./build2/binary
/Users/GanymedeNil/GoglandProjects/go-standard-library/current-working-directory/build2/binary
可执行文件路径 :/Users/GanymedeNil/GoglandProjects/go-standard-library/current-working-directory/build2
符号链接真实路径:/Users/GanymedeNil/GoglandProjects/go-standard-library/current-working-directory/build
原理
从Go 1.8 起,os
包中的Executable
方法是解析可执行文件路径的首选方法。该方法返回执行的二进制文件的绝对路径(除非返回错误)。
要获取二进制文件目录的路径可以使用filepath
包中的Dir
方法。但是使用该方法有一个缺陷就是返回的路径可能是symlink
指向的路径。
为了避免这种问题,可以使用filepath
包中的EvalSymlinks
方法,来进行转换。有了这个hack,返回的值就是二进制文件的真实路径。
注意如果使用go run
执行,则实际的可执行文件会在临时目录中。