前言
在go官方出嵌入文件的方法前我在網上找過,并且自己還研究過,雖然沒有問題,但是既然官方支持還是用起來吧。
看了下go源碼embed/embed.go
很簡單,并且看embed/internal/embedtest/embed_test.go
就知道如何使用。
示例程序
嵌入文件直接訪問
原理是使用go:embed
標簽來完成。下面是直接讀取文件內容,需要注意下面幾點。
文件不是utf8
編碼時,輸出內容為中文會亂碼。
測試過嵌入文件只能為源碼文件同級目錄和子目錄下的文件,試過其他目錄的絕對路徑或相對路徑會報錯。
我測試過幾個能想到的場景,有些會報錯,所以在使用時需要注意。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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) } |
嵌入文件列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
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測試文件就知道是如何使用的,都不需要到處搜教程。
所以說學習要知其然且知其所以然,不然天天搜別人的示例代碼,卻不知道原理,是不能靈活使用的。
到此這篇關于golang官方嵌入文件到可執行程序的文章就介紹到這了,更多相關golang嵌入文件到可執行程序內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/janbar/p/14412784.html