为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕姐4208626 2022-06-13 16:44:24
我有以下目录结构:module A       |- static       |    |- file.txt       |- a.gomodule B       |- b.go在 a.go 我有一个func A()读取static/file.txt的内容并返回结果在 b.go 我有一个func main()调用func A()导入的模块 A测试时 main() 函数返回错误“找不到文件”,因为它试图在正在执行代码的 B/static/file.txt 文件夹中找到文件。构建 func A() 以读取附加到该模块静态文件的正确方法是什么?
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

路径相对于运行时执行代码的目录。文件包含在与包相同的目录中这一事实并不意味着它与之相关联。它不会与包一起编译。


您必须/path/to/static/file.txt通过命令行参数(使用flags模块)或环境变量将绝对路径传递给文件。


使用标志


在模块 A


package A

import (

    "flag"

    "os"

)


func init() {

    var filePath = flag.String("filePath", "DEFAULT_PATH", "help message for flagname")

    file, err := os.Open(*filePath)

}

在命令行中运行


注意: main.go 导入包 A


go 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 A

import (

    "os"

)


func init() {

    file, err := os.Open(os.Getenv("FILE_PATH"))

}


查看完整回答
反对 回复 2022-06-13
?
慕沐林林

TA贡献2016条经验 获得超9个赞

如果你要忽略运行时的路径,你可以试试 runtime.Caller(0) (不推荐,完整的文件路径可能比这个解决方案更好)


在 a.go 里面


_, f, _, _ := runtime.Caller(0)

dirPath := filepath.Dir(file)


file, err := os.Open(filepath.Join(dirPath, "static", "file.txt"))


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信