在Go语言中,如何打开与.go源文件在同一目录下的文件?

4
在源文件 $PWD/dir/src.go 中使用时,我会使用:
os.Open("myfile.txt")

它在$PWD中寻找myfile.txt(看起来很正常)。

有没有办法告诉Go在与src.go相同的目录中查找myfile.txt?我需要类似于Ruby中的__FILE__的东西。

3个回答

8

Go不是一种解释型语言,因此在与源文件相同位置查找文件没有任何意义。Go二进制文件被编译,二进制文件不需要源文件存在即可运行。因此,Go没有类似FILE的函数。runtime.Caller函数返回在编译二进制文件时的文件名。

也许如果我们了解您为什么需要这个功能,我们可以更好地为您提供建议。


好的回答...实际上我的Go程序需要从外部文件加载数据,并且我希望确保它能够找到它们,而不必设置这些文件的绝对路径。 - Blacksad
1
也许你只是想为你的应用程序设置一个约定,并使其相对于运行位置加载文件。或者使用flags包,在命令行上告诉它文件在哪里。 - Jeremy Wall

0
一个可能的替代框架:
func __FILE__() (fn string) {
        _, fn, _, _ = runtime.Caller(0)
        return 
}

详情请点击这里


谢谢jnml,我不知道runtime.Caller。最终我按照Jeremy的建议加载了我的文件,但这很有用。 - Blacksad

0

使用 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)
}

你也可以获取完整的可执行文件路径(类似于__FILE__):

package main

import (
    "github.com/kardianos/osext"
    "fmt"
)

func main() {
    exeAbsolutePath, _ := osext.Executable()
    fmt.Println(exeAbsolutePath)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接