在nodejs中,我使用__dirname。在戈朗,这相当于什么?

我在谷歌上找到了这篇文章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"))

但在戈朗,这是正确的方式还是惯用的方式?


当前回答

如果你的文件不在主包中,那么上面的答案将不起作用 我尝试了不同的方法来找到当前运行文件的目录,但失败了。

最好的答案是在问题本身,这就是我如何找到不在主包中的文件的当前工作目录。

_, filename, _, _ := runtime.Caller(1)
pwd := path.Dir(filename)

其他回答

filepath.Abs("./")

Abs返回路径的绝对表示形式。如果路径不是 绝对会将它与当前工作目录连接起来转 它变成了一个绝对路径。

如注释中所述,这将返回当前活动的目录。

如果你使用kardianos的osext包,你需要在本地测试,就像Derek Dowling评论的那样:

这工作很好,直到你想使用它与go run main。去 当地的发展。不知道该怎么解决这个问题 每次都预先构建一个可执行文件。

解决方案是创建一个gorun.exe实用程序,而不是使用gorun。gorun.exe实用程序将使用“go build”编译项目,然后立即在项目的正常目录中运行它。

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

如果有人喜欢我的gorun.exe(或elf)的想法,我可能很快就会把它上传到github。

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

或者,“go run”也可以被修改(如果它还没有这个特性的话),让它有一个像“go run -notemp”这样的参数来不在临时目录(或类似的目录)中运行程序。但我更喜欢输入gorun或“gor”,因为它比复杂的参数要短。Gorun.exe或Gorun.exe需要安装在与go编译器相同的目录中

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

使用osext包

它提供了ExecutableFolder()函数,该函数返回当前运行的可执行程序所在文件夹的绝对路径(对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)
}

如果你的文件不在主包中,那么上面的答案将不起作用 我尝试了不同的方法来找到当前运行文件的目录,但失败了。

最好的答案是在问题本身,这就是我如何找到不在主包中的文件的当前工作目录。

_, filename, _, _ := runtime.Caller(1)
pwd := path.Dir(filename)

不要在runtime.Caller(0)中使用“Go Language推荐的答案”。

当你构建或安装一个程序时,这是有效的,因为你是在重新编译它。

但是当你构建一个程序,然后将它(复制)分发到你同事的工作站上(他们没有go,只需要可执行文件),runtime.Caller(0)的结果仍然是你构建它的路径(从你的计算机)。 即在自己的计算机上可能不存在的路径。

操作系统。Args[0]或者更好的os.Executable()(这里提到)和kardianos/osext(这里和这里提到)更可靠。