當我從除 main 之外的其他 go 檔案訪問檔案時如何處理檔案路徑。
在 other.go 檔案中,我試圖運行 ParseFS,但它給出了模板:模式不匹配檔案:templates/test.tmpl錯誤。這是我的檔案樹。
├── go.mod
├── main
│ └── main.go
└── other
├── other.go
└── templates
└── test.tmpl
其他/other.go
package other
import (
"embed"
"fmt"
"html/template"
)
var templateFS embed.FS
func Check() error {
_, err := template.New("email").ParseFS(templateFS, "templates/" "test.tmpl")
if err != nil {
fmt.Println(err)
}
return nil
}
主/main.go
func main() {
err :=othher.Check()
if err != nil {
fmt.Println(err)
}
}
uj5u.com熱心網友回復:
Go 是一種靜態鏈接語言。無論您撰寫什么源代碼,最終該go工具都會將其編譯為可執行的二進制檔案。之后將不需要源檔案來運行二進制檔案。
該embed包為您提供了一種在可執行二進制檔案中包含靜態檔案的方法,您可以在運行時訪問這些檔案(運行應用程式時不需要存在原始包含的檔案)。
但是,該go工具不會神奇地找出您想要在二進制檔案中包含哪些檔案和檔案夾。它顯然不會包括您在源或模塊檔案夾中的所有內容。
判斷要包含哪些檔案的方法是在//go:embed要存盤檔案的變數之前添加一個特殊注釋。
因此,在您的情況下,您必須在templateFS變數之前添加以下注釋:
//go:embed templates/*
var templateFS embed.FS
另請注意,嵌入僅在您匯入embed包時才有效。這種“自然”發生在您的情況下,因為您使用了embed.FS型別(需要匯入embed包),但是如果您將檔案包含在string或[]byte型別的變數中,則不需要 importing embed,在這種情況下您必須做一個“空白”匯入,比如
import _ "embed"
更多詳細資訊在embed.
請參閱相關問題:在 Go 程式中捆綁靜態資源的最佳方式是什么?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439837.html
