golang官方嵌入文件到可執(zhí)行程序的示例詳解
前言
在go官方出嵌入文件的方法前我在網(wǎng)上找過,并且自己還研究過,雖然沒有問題,但是既然官方支持還是用起來吧。
看了下go源碼embed/embed.go很簡(jiǎn)單,并且看embed/internal/embedtest/embed_test.go就知道如何使用。
示例程序
嵌入文件直接訪問
原理是使用go:embed標(biāo)簽來完成。下面是直接讀取文件內(nèi)容,需要注意下面幾點(diǎn)。
文件不是utf8編碼時(shí),輸出內(nèi)容為中文會(huì)亂碼。
測(cè)試過嵌入文件只能為源碼文件同級(jí)目錄和子目錄下的文件,試過其他目錄的絕對(duì)路徑或相對(duì)路徑會(huì)報(bào)錯(cuò)。
我測(cè)試過幾個(gè)能想到的場(chǎng)景,有些會(huì)報(bào)錯(cuò),所以在使用時(shí)需要注意。
package main
import (
_ "embed"
)
//go:embed test.txt
var testString string // 當(dāng)前目錄,解析為string類型
//go:embed test.txt
var testByte []byte // 當(dāng)前目錄,解析為[]byte類型
//go:embed test/test.txt
var testAbsolutePath string // 子目錄,解析為string類型
//go:embed notExistsFile
var testErr0 string // 文件不存在,編譯報(bào)錯(cuò):pattern notExistsFile: no matching files found
//go:embed dir
var testErr1 string // dir是目錄,編譯報(bào)錯(cuò):pattern dir: cannot embed directory dir: contains no embeddable files
//go:embed ../test.txt
var testErr2 string // 相對(duì)路徑,不是當(dāng)前目錄或子目錄,編譯報(bào)錯(cuò):pattern ../test.txt: invalid pattern syntax
//go:embed D:\test.txt
var testErr3 string // 絕對(duì)路徑,編譯報(bào)錯(cuò):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
/*
使用上述方法可以將多個(gè)文件或目錄添加到fileList中。
1. 添加多個(gè)文件,且支持"*"號(hào)通配文件。
2. 支持子目錄文件。
3. 支持嵌入一個(gè)目錄。
*/
func main() {
testDir, err := fileList.ReadDir("test0")
if err != nil {
panic(err)
}
for _, v := range testDir {
println(v.Name()) // 打印嵌入的目錄內(nèi)容
}
// 使用fileList.Open可以生成一個(gè)對(duì)象,可以通過文件流那樣讀出來
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)
// 直接將文件內(nèi)容讀出來
data, err := fileList.ReadFile("test111.txt")
if err != nil {
panic(err)
}
println(string(data))
}
總結(jié)
今天看到go1.16發(fā)布,看了下特性,支持嵌入文件到可執(zhí)行程序中,所以研究了一下。
我發(fā)現(xiàn)直接看源碼的_test測(cè)試文件就知道是如何使用的,都不需要到處搜教程。
所以說學(xué)習(xí)要知其然且知其所以然,不然天天搜別人的示例代碼,卻不知道原理,是不能靈活使用的。
到此這篇關(guān)于golang官方嵌入文件到可執(zhí)行程序的文章就介紹到這了,更多相關(guān)golang嵌入文件到可執(zhí)行程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 實(shí)現(xiàn)tcp server端和client端,并計(jì)算RTT時(shí)間操作
這篇文章主要介紹了golang 實(shí)現(xiàn)tcp server端和client端,并計(jì)算RTT時(shí)間操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Golang極簡(jiǎn)入門教程(四):編寫第一個(gè)項(xiàng)目
這篇文章主要介紹了Golang極簡(jiǎn)入門教程(四):編寫第一個(gè)項(xiàng)目,本文講解了workspace、包路徑、第一個(gè)可執(zhí)行命令等內(nèi)容,需要的朋友可以參考下2014-10-10
golang提示dial?tcp?172?.217.163.49:443:?connectex:?A?con
這篇文章主要為大家介紹了golang提示dial?tcp?172?.217.163.49:443:?connectex:?A?connection?attempt?failed解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
golang中使用proto3協(xié)議導(dǎo)致的空值字段不顯示的問題處理方案
這篇文章主要介紹了golang中使用proto3協(xié)議導(dǎo)致的空值字段不顯示的問題處理方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Go語(yǔ)言集成開發(fā)環(huán)境之VS Code安裝使用
VS Code是微軟開源的一款編輯器,插件系統(tǒng)十分的豐富,下面介紹如何用VS Code搭建go語(yǔ)言開發(fā)環(huán)境,需要的朋友可以參考下2021-10-10
Golang實(shí)現(xiàn)Md5校驗(yàn)的示例代碼
本文主要介紹了Golang實(shí)現(xiàn)Md5校驗(yàn)的示例代碼,要求接收方需要文件的md5值,和接收到的文件做比對(duì),以免文件不完整,但引起bug,下面就一起來解決一下2024-08-08

