Go 如何获取文件所在包的目录,而不是当前工作目录

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

我正在制作一个包来对服务进行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/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表示调用者的调用者。
是的,但这并不能解决我的评论。你怎么知道要跳过多少帧?你不能,真的,所以如果可以的话最好不要依赖它。