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

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


当前回答

filepath.Abs("./")

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

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

其他回答

有时这就足够了,第一个参数总是文件路径

package main

import (
    "fmt"
    "os"
)


func main() {
    fmt.Println(os.Args[0])

    // or
    dir, _ := os.Getwd()
    fmt.Println(dir)
}

如果你用这种方式:

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

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

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

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

这里没有一个答案对我有用,至少在go版本go1.16.2 darwin/amd64上。这是唯一接近node中的__dirname功能的东西

这是金牌工程师daniel Maslov在jetbrains论坛上发布的

粘贴在下面以方便阅读:


这个技巧实际上很简单,就是获取当前正在执行的文件并添加..到项目根目录。

创建一个新的目录和文件,如testing_init。跟着下面的内容走:

package testing_init

import (
  "os"
  "path"
  "runtime"
)

func init() {
  _, filename, _, _ := runtime.Caller(0)
  dir := path.Join(path.Dir(filename), "..")
  err := os.Chdir(dir)
  if err != nil {
    panic(err)
  }
}

之后,只需将包导入到任何测试文件中:


package main_test

import (
  _ "project/testing_init"
)

现在您可以从项目根目录指定路径

操作系统。可执行文件: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)
}