Go 如何获取文件所在包的目录,而不是当前工作目录
我正在制作一个包来对服务进行API调用 我有一个测试包,我用它来测试API调用和主包的功能,我只是Go 如何获取文件所在包的目录,而不是当前工作目录,go,Go,我正在制作一个包来对服务进行API调用 我有一个测试包,我用它来测试API调用和主包的功能,我只是将另一个包包含在其中 在我正在开发的主程序包中 ioutil.ReadFile(filepath.Abs(“Filename.pub”) 这是可以的,但当我从测试包调用它时,例如 /Users/#####/gocode/src/github.com/testfolder go run main.go 它告诉我 panic:open/Users/######/gocode/src/github.com
将另一个包包含在其中
在我正在开发的主程序包中
ioutil.ReadFile(filepath.Abs(“Filename.pub”)
这是可以的,但当我从测试包调用它时,例如
/Users/#####/gocode/src/github.com/testfolder go run main.go
它告诉我
panic:open/Users/######/gocode/src/github.com/testfolder/public.pub:没有这样的文件或目录
问题是,它在testfolder
中查找public.pub
,而不是它所在的github.com/apipack/
为了澄清这一混乱的字眼:
API包有一个从同一目录读取的函数
但是因为我包含了API包,当我运行main.go时Testfolder就是CWD,所以它试图从Testfolder.go中获取它,尽管main.go没有这个函数,只是包含了它。我相信这就是你想要的
下面是一个演示:
package main
import (
"fmt"
"runtime"
"path"
)
func main() {
_, filename, _, ok := runtime.Caller(0)
if !ok {
panic("No caller information")
}
fmt.Printf("Filename : %q, Dir : %q\n", filename, path.Dir(filename))
}
当我对此运行快速测试时,当前文件处于运行时。调用者(3)
当我调试测试时,因此(0)
不能保证是您想要的值。@jcollum如果您包装了运行时。调用者
调用不在您想要的目录中的函数,您只需要增加这个数字。通常,如果您使用此代码段创建了一个helper函数,则会将0替换为1。我认为无法确定运行时需要哪一级别的runtime.Caller。如果可以,最好不要依赖它。你可以,即使是静态的。下面是文档中所说的:参数skip是要提升的堆栈帧数,0表示调用者的调用者。
是的,但这并不能解决我的评论。你怎么知道要跳过多少帧?你不能,真的,所以如果可以的话最好不要依赖它。