目錄
- 前言
- 示例程式
- 嵌入檔案直接訪問
- 嵌入檔案串列
- 總結
前言
在go官方出嵌入檔案的方法前我在網上找過,并且自己還研究過,雖然沒有問題,但是既然官方支持還是用起來吧,
看了下go原始碼embed/embed.go很簡單,并且看embed/internal/embedtest/embed_test.go就知道如何使用,
示例程式
嵌入檔案直接訪問
原理是使用
go:embed標簽來完成,下面是直接讀取檔案內容,需要注意下面幾點,
檔案不是utf8編碼時,輸出內容為中文會亂碼,
測驗過嵌入檔案只能為原始碼檔案同級目錄和子目錄下的檔案,試過其他目錄的絕對路徑或相對路徑會報錯,
我測驗過幾個能想到的場景,有些會報錯,所以在使用時需要注意,
package main
import (
_ "embed"
)
//go:embed test.txt
var testString string // 當前目錄,決議為string型別
//go:embed test.txt
var testByte []byte // 當前目錄,決議為[]byte型別
//go:embed test/test.txt
var testAbsolutePath string // 子目錄,決議為string型別
//go:embed notExistsFile
var testErr0 string // 檔案不存在,編譯報錯:pattern notExistsFile: no matching files found
//go:embed dir
var testErr1 string // dir是目錄,編譯報錯:pattern dir: cannot embed directory dir: contains no embeddable files
//go:embed ../test.txt
var testErr2 string // 相對路徑,不是當前目錄或子目錄,編譯報錯:pattern ../test.txt: invalid pattern syntax
//go:embed D:\test.txt
var testErr3 string // 絕對路徑,編譯報錯:pattern D:\test.txt: no matching files found
func main() {
println(testString)
println(string(testByte))
println(testAbsolutePath)
}
嵌入檔案串列
package main
import (
"embed"
"io"
"os"
)
//go:embed test0.txt test1.txt test1*.txt
//go:embed test/test0.txt test/test1.txt
//go:embed test0
var fileList embed.FS
/*
使用上述方法可以將多個檔案或目錄添加到fileList中,
1. 添加多個檔案,且支持"*"號通配檔案,
2. 支持子目錄檔案,
3. 支持嵌入一個目錄,
*/
func main() {
testDir, err := fileList.ReadDir("test0")
if err != nil {
panic(err)
}
for _, v := range testDir {
println(v.Name()) // 列印嵌入的目錄內容
}
// 使用fileList.Open可以生成一個物件,可以通過檔案流那樣讀出來
testFile, err := fileList.Open("test0.txt")
if err != nil {
panic(err)
}
io.Copy(os.Stdout, testFile)
testFile, err = fileList.Open("test112.txt")
if err != nil {
panic(err)
}
io.Copy(os.Stdout, testFile)
testFile, err = fileList.Open("test/test1.txt")
if err != nil {
panic(err)
}
io.Copy(os.Stdout, testFile)
// 直接將檔案內容讀出來
data, err := fileList.ReadFile("test111.txt")
if err != nil {
panic(err)
}
println(string(data))
}
總結
今天看到go1.16發布,看了下特性,支持嵌入檔案到可執行程式中,所以研究了一下,
我發現直接看原始碼的_test測驗檔案就知道是如何使用的,都不需要到處搜教程,
所以說學習要知其然且知其所以然,不然天天搜別人的示例代碼,卻不知道原理,是不能靈活使用的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260853.html
標籤:Go
