如何获取当前正在运行的文件的目录?

在nodejs中,我使用__dirname 。 Golang的这个相当于什么?

我GOOGLE了,发现这篇文章http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/ 。 他在哪里使用下面的代码

_, filename, _, _ := runtime.Caller(1) f, err := os.Open(path.Join(path.Dir(filename), "data.csv")) 

但是在Golang中,这是否是正确的方式呢?

这应该做到这一点:

 import ( "fmt" "log" "os" "path/filepath" ) func main() { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { log.Fatal(err) } fmt.Println(dir) } 

编辑:自去1.8(2017年2月发布)推荐的做法是与os.Executable

func Executable() (string, error)

可执行文件返回启动当前进程的可执行文件的path名称。 不能保证path仍然指向正确的可执行文件。 如果使用符号链接启动进程,则根据操作系统的不同,结果可能是符号链接或指向的path。 如果需要稳定的结果,path / filepath.EvalSymlinks可能会有所帮助。

要获取可执行文件的目录,可以使用path/filepath.Dir

例如 :

 package main import ( "fmt" "os" "path/filepath" ) func main() { ex, err := os.Executable() if err != nil { panic(err) } exPath := filepath.Dir(ex) fmt.Println(exPath) } 

老解答:

你应该可以使用os.Getwd

 func Getwd() (pwd string, err error) 

Getwd返回与当前目录对应的根path名。 如果当前目录可以通过多个path到达(由于符号链接),Getwd可以返回其中任何一个。

例如:

 package main import ( "fmt" "os" ) func main() { pwd, err := os.Getwd() if err != nil { fmt.Println(err) os.Exit(1) } fmt.Println(pwd) } 

使用软件包osext

它提供了函数ExecutableFolder() ,它返回当前正在运行的程序可执行文件所在的文件夹的绝对path(对cron作业有用)。 这是跨平台。

在线文档

 package main import ( "github.com/kardianos/osext" "fmt" "log" ) func main() { folderPath, err := osext.ExecutableFolder() if err != nil { log.Fatal(err) } fmt.Println(folderPath) } 

如果你使用kardianos的osext ,你需要在本地进行testing,就像Derek Dowling所说:

这工作正常,直到你想使用它与本地开发运行main.go。 不知道每次事先build立一个可执行文件的时候,如何最好地解决这个问题。

解决方法是制作一个gorun.exe实用程序,而不是使用go run。 gorun.exe工具将使用“go build”编译项目,然后在项目的正常目录中运行它。

我与其他编译器有这个问题,并发现自己做这些实用程序,因为它们没有与编译器一起提供…这是特别的工具像C,你必须编译和链接,然后运行它(太多的工作)。

如果有人喜欢我的想法gorun.exe(或小精灵),我可能会很快上传到github ..

对不起,这个答案是作为一个评论,但我不能评论,因为我没有足够的声誉。

或者,可以修改“去运行”(如果它没有这个function的话),使其具有诸如“go run -notemp”之类的参数不在临时目录(或类似的东西)中运行该程序的参数。 但是我宁愿inputgorun或者“gor”,因为它比一个复杂的参数短。 Gorun.exe或gor.exe将需要安装在您的编译器所在的目录中

实现gorun.exe(或gor.exe)将是微不足道的,因为我只用了几行代码就完成了其他编译​​器…(着名的遗言;-)

简单而简单的习惯解决scheme

 filepath.Abs("./") 

Abs返回path的绝对表示。 如果path不是绝对path,则会将其与当前工作目录连接,以将其转化为绝对path。