在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"))
但在戈朗,这是正确的方式还是惯用的方式?
编辑:从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)
}
操作系统。可执行文件: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)
}
如果你使用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)将是微不足道的,因为我只用了几行代码就用其他编译器完成了…(著名的遗言;-)