問題是我無法訪問相對于實際使用的包路徑的文件。讓我們考慮這個例子。我有以下結構:~/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個贊
問題是您的數據庫文件將不是已編譯二進制文件的一部分。當您運行代碼時,您似乎希望它與二進制文件一起打包。
我認為你應該重新考慮你的方法。您的源代碼將被編譯為要運行的靜態二進制文件,但該二進制文件將不包含您的數據庫文件。嘗試可靠地猜測正確的路徑會很麻煩。
我會將數據庫文件的路徑移動到配置參數中,或者在運行時需要位于當前工作目錄中的配置文件中,或者作為環境變量。然后,將數據庫文件從包目錄中拉出,因為它在那里不會幫助您。
至于在運行時最初獲取文件,您只需添加一個設置函數,該函數將根據需要為您的數據庫提供支架?;蛘撸绻M跀祿熘杏幸恍╊A加載的數據,只需將它與最終的二進制文件和配置文件放在一個包中即可。
希望有幫助!
- 2 回答
- 0 關注
- 191 瀏覽
添加回答
舉報
0/150
提交
取消