如何通过从另一个模块 B 调用模块的 A 函数来读取位于模块 A 中的静态文件?

我有以下目录结构:


module A

       |- static

       |    |- file.txt

       |- a.go

module B

       |- b.go

在 a.go 我有一个func A()读取static/file.txt的内容并返回结果

在 b.go 我有一个func main()调用func A()导入的模块 A

测试时 main() 函数返回错误“找不到文件”,因为它试图在正在执行代码的 B/static/file.txt 文件夹中找到文件。


构建 func A() 以读取附加到该模块静态文件的正确方法是什么?


慕姐4208626
浏览 150回答 2
2回答

拉风的咖菲猫

路径相对于运行时执行代码的目录。文件包含在与包相同的目录中这一事实并不意味着它与之相关联。它不会与包一起编译。您必须/path/to/static/file.txt通过命令行参数(使用flags模块)或环境变量将绝对路径传递给文件。使用标志在模块 Apackage Aimport (    "flag"    "os")func init() {    var filePath = flag.String("filePath", "DEFAULT_PATH", "help message for flagname")    file, err := os.Open(*filePath)}在命令行中运行注意: main.go 导入包 Ago run main.go -filePath=/path/to/file.txt在init()函数中使用标志会很快变得棘手,因此您可以(我强烈建议您)使用环境变量。对于基于 Linux 的系统,添加路径中包含export FILE_PATH=/path/to/file的.profileor.bashrc文件。$HOME也运行source .profile或source .basrc取决于编辑哪个文件以立即进行更改。然后您可以将包 A更新为如下所示:package Aimport (    "os")func init() {    file, err := os.Open(os.Getenv("FILE_PATH"))}

慕沐林林

如果你要忽略运行时的路径,你可以试试 runtime.Caller(0) (不推荐,完整的文件路径可能比这个解决方案更好)在 a.go 里面_, f, _, _ := runtime.Caller(0)dirPath := filepath.Dir(file)file, err := os.Open(filepath.Join(dirPath, "static", "file.txt"))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go