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

如何获取相对于导入包路径的文件路径?

如何获取相对于导入包路径的文件路径?

Go
慕妹3146593 2021-10-18 17:15:59
问题是我无法访问相对于实际使用的包路径的文件。让我们考虑这个例子。我有以下结构:~/go/src/github.com/user/dbms  data/    database.db  dbms.go~/projects/myproj/bin  main.godbms.go :package dbmsimport (  "os"  "fmt"  "path/filepath")type dbms struct {  filepath string}func New() *dbms {  return &dbms{filepath: "./data/database.db"}}func (d *dbms) Run() {  fmt.Println(filepath.Abs(d.Path))  // output: /home/timur/projects/myproj/bin/data  // I need: /home/timur/go/src/github.com/user/dbms/data  file, err := os.OpenFile(d.filepath, os.O_RDWR, 0666)  // error}main.go :package mainimport (  "github.com/user/dbms")func main() {  db := dbms.New()  db.Run()}如您所见,dbms.Path解析相对于入口点的路径而不是包本身。我怎么了?
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

问题是您的数据库文件将不是已编译二进制文件的一部分。当您运行代码时,您似乎希望它与二进制文件一起打包。

我认为你应该重新考虑你的方法。您的源代码将被编译为要运行的静态二进制文件,但该二进制文件将不包含您的数据库文件。尝试可靠地猜测正确的路径会很麻烦。

我会将数据库文件的路径移动到配置参数中,或者在运行时需要位于当前工作目录中的配置文件中,或者作为环境变量。然后,将数据库文件从包目录中拉出,因为它在那里不会帮助您。

至于在运行时最初获取文件,您只需添加一个设置函数,该函数将根据需要为您的数据库提供支架。或者,如果您希望在数据库中有一些预加载的数据,只需将它与最终的二进制文件和配置文件放在一个包中即可。

希望有帮助!


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

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