go基础库之获取当前工作目录

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执行,则实际的可执行文件会在临时目录中。