在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"))
但在戈朗,这是正确的方式还是惯用的方式?
我从Node.js转到Go。在Go中等价于__dirname的Node.js是:
_, filename, _, ok := runtime.Caller(0)
if !ok {
return errors.New("unable to get the current filename")
}
dirname := filepath.Dir(filename)
这篇文章中提到的其他内容以及它们错误的原因:
os.Executable()将为您提供当前运行的可执行文件的文件路径。这相当于过程。argv[0]在节点。如果你想要获取子包的__dirname,这是不正确的。
os.Getwd()会给你当前的工作目录。这相当于Node中的process.cwd()。当您从另一个目录运行程序时,这将是错误的。
最后,我建议不要为这个用例引入第三方包。这里有一个你可以使用的包:
package current
// Filename is the __filename equivalent
func Filename() (string, error) {
_, filename, _, ok := runtime.Caller(1)
if !ok {
return "", errors.New("unable to get the current filename")
}
return filename, nil
}
// Dirname is the __dirname equivalent
func Dirname() (string, error) {
filename, err := Filename()
if err != nil {
return "", err
}
return filepath.Dir(filename), nil
}
注意,我已经将runtime.Caller(1)调整为1,因为我们想要获得调用current. dirname()的包的目录,而不是包含当前包的目录。
我从Node.js转到Go。在Go中等价于__dirname的Node.js是:
_, filename, _, ok := runtime.Caller(0)
if !ok {
return errors.New("unable to get the current filename")
}
dirname := filepath.Dir(filename)
这篇文章中提到的其他内容以及它们错误的原因:
os.Executable()将为您提供当前运行的可执行文件的文件路径。这相当于过程。argv[0]在节点。如果你想要获取子包的__dirname,这是不正确的。
os.Getwd()会给你当前的工作目录。这相当于Node中的process.cwd()。当您从另一个目录运行程序时,这将是错误的。
最后,我建议不要为这个用例引入第三方包。这里有一个你可以使用的包:
package current
// Filename is the __filename equivalent
func Filename() (string, error) {
_, filename, _, ok := runtime.Caller(1)
if !ok {
return "", errors.New("unable to get the current filename")
}
return filename, nil
}
// Dirname is the __dirname equivalent
func Dirname() (string, error) {
filename, err := Filename()
if err != nil {
return "", err
}
return filepath.Dir(filename), nil
}
注意,我已经将runtime.Caller(1)调整为1,因为我们想要获得调用current. dirname()的包的目录,而不是包含当前包的目录。
如果你用这种方式:
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
这里没有一个答案对我有用,至少在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"
)
现在您可以从项目根目录指定路径