在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"))

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


当前回答

操作系统。可执行文件:https://tip.golang.org/pkg/os/可执行文件

filepath。EvalSymlinks: https://golang.org/pkg/path/filepath/ # EvalSymlinks

完整的演示:

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    var dirAbsPath string
    ex, err := os.Executable()
    if err == nil {
        dirAbsPath = filepath.Dir(ex)
        fmt.Println(dirAbsPath)
        return
    }

    exReal, err := filepath.EvalSymlinks(ex)
    if err != nil {
        panic(err)
    }
    dirAbsPath = filepath.Dir(exReal)
    fmt.Println(dirAbsPath)
}

其他回答

如果你用这种方式:

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

当你使用一些IDE(如GoLand)运行程序时,你会得到/tmp路径,因为可执行文件将从/tmp保存和运行

我认为获取当前工作目录或'的最佳方法。’是:

import(
  "os" 
  "fmt"
  "log"
)

func main() {
  dir, err := os.Getwd()
    if err != nil {
        log.Fatal(err)
    }
  fmt.Println(dir)
}

os.Getwd()函数将返回当前工作目录。 而且这一切都不需要使用任何外部库:D

操作系统。可执行文件:https://tip.golang.org/pkg/os/可执行文件

filepath。EvalSymlinks: https://golang.org/pkg/path/filepath/ # EvalSymlinks

完整的演示:

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    var dirAbsPath string
    ex, err := os.Executable()
    if err == nil {
        dirAbsPath = filepath.Dir(ex)
        fmt.Println(dirAbsPath)
        return
    }

    exReal, err := filepath.EvalSymlinks(ex)
    if err != nil {
        panic(err)
    }
    dirAbsPath = filepath.Dir(exReal)
    fmt.Println(dirAbsPath)
}

编辑:从Go 1.8(2017年2月发布)开始,推荐使用os。可执行:

func可执行()(字符串,错误) Executable返回启动当前进程的可执行文件的路径名。不能保证路径仍然指向正确的可执行文件。如果使用符号链接启动进程,则结果可能是符号链接或它所指向的路径,这取决于操作系统。如果需要稳定的结果,请输入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)
}

旧的回答:

你应该会使用操作系统。Getwd

func Getwd() (pwd string, err error)

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

例如:

package main

import (
    "fmt"
    "os"
)

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

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

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

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

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

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

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