Go打包靜態(tài)文件的兩種方式
一、前言
使用 Go 開發(fā)應(yīng)用的時(shí)候,有時(shí)會(huì)遇到需要讀取靜態(tài)資源的情況。
比如:開發(fā) Web 應(yīng)用,程序需要加載模板文件生成輸出的 HTML。在程序部署的時(shí)候,除了發(fā)布應(yīng)用可執(zhí)行文件外,還需要發(fā)布依賴的靜態(tài)資源文件。這給發(fā)布過(guò)程添加了一些麻煩。
比如:項(xiàng)目中有一些靜態(tài)模板需要渲染,然而這些模板又是固定的靜態(tài)文件
如果不打包處理這種靜態(tài)文件:發(fā)布單獨(dú)掛載這種靜態(tài)文件相對(duì)比較麻煩,就有人會(huì)想辦法把靜態(tài)資源文件打包進(jìn) Go 的程序文件中。
下面介紹兩種打包方式:go-bindata、go:embed
二、go-bindata打包靜態(tài)資源
go-bindata 將任何文件封裝在一個(gè) Go 語(yǔ)言的 Source Code 里面,文件數(shù)據(jù)在轉(zhuǎn)換為原始字節(jié)時(shí)可以選擇使用 gzip 壓縮,同時(shí)提供了統(tǒng)一的接口,幫助獲取原始的文件數(shù)據(jù)
2.1 安裝
go get -u github.com/go-bindata/go-bindata/...
安裝打包工具 go-bindata 到GOPATH/bin中,輸入下面的命令檢查下是否安裝成功:
go-bindata --version
2.2 打包
go-bindata -o=resource.go -pkg=resource ./resource/...
- 將把
./resource目錄下的所有文件轉(zhuǎn)換為Go代碼,注意后面的... 代表講該文件下面所有的文件及子文件打包
- 生成一個(gè)名為
resource.go的文件,你可以在你的Go代碼中通過(guò)main包來(lái)訪問這些靜態(tài)文件。
如果你查看源文件,可以查看 _bindata 中維護(hù)了文件的信息
2.3 使用
- Asset(name string) ([]byte, error) :根據(jù)資源名稱返回文件內(nèi)容
- MustAsset(name string) []byte :根據(jù)資源名稱返回文件內(nèi)容
- AssetInfo(name string) (os.FileInfo, error) : 根據(jù)資源名稱返回文件信息
- AssetNames() []string :返回所有的資源名稱
- AssetDir(name string) ([]string, error) : 返回某一個(gè)文件夾一層的名稱
- RestoreAsset(dir, name string) error
- RestoreAssets(dir, name string) error
三、go:embed 打包靜態(tài)資源
Go 1.16版本開始,可以使用go:embed來(lái)嵌入文件。
embed是在Go 1.16中新加包。它通過(guò)//go:embed指令,可以在編譯階段將靜態(tài)資源文件打包進(jìn)編譯好的程序(exe)中,并提供訪問這些文件的能力。
- 對(duì)于單個(gè)的文件,支持嵌入類型為
string和byte slice - 對(duì)于多個(gè)文件和文件夾,支持嵌入為新的文件系統(tǒng)FS
- 比如導(dǎo)入
"embed"包,即使無(wú)顯式的使用 - go:embed指令用來(lái)嵌入,必須緊跟著嵌入后的變量名
注意:go embed的使用只能用于包級(jí)別聲明的變量(全局變量)
3.1 embed 要嵌入的文件
//go:embed 要嵌入的文件
- 示例一
import (
_ "embed"
"fmt"
)
?
//go:embed repos.tmpl
var data string
?
func main() {
fmt.Println(data)
}
- 示例二
import (
_ "embed"
"fmt"
)
?
//go:embed repos.tmpl
var data []byte
?
func main() {
fmt.Println(string(data))
}
3.2 嵌入文件系統(tǒng)FS
對(duì)于多個(gè)文件和文件夾,支持嵌入為新的文件系統(tǒng)FS
embed.FS提供了三個(gè)方法進(jìn)行訪問:
Open(name string) (fs.File, error) 根據(jù)資源key返回文件 ? ReadFile(name string) ([]byte, error) 根據(jù)資源key返回文件內(nèi)容 ? ReadDir(name string) ([]fs.DirEntry, error) 根據(jù)key讀取文件夾
- 嵌入文件夾
使用embed.FS嵌入的文件變量,具有3種功能,如下所示:
import (
"embed"
_ "embed"
"fmt"
)
?
//go:embed resource
var data embed.FS
?
func main() {
// 直接讀取文件
file, err := data.ReadFile("resource/cmd/main.go.tmpl")
fmt.Println(string(file), err)
}
- 嵌入多個(gè)文件
import (
"embed"
_ "embed"
"fmt"
)
?
//go:embed aa.text bb.text
var data embed.FS
?
func main() {
file, err := data.ReadFile("aa.text")
fmt.Println(string(file), err)
}
到此這篇關(guān)于Go打包靜態(tài)文件的兩種方式的文章就介紹到這了,更多相關(guān)Go打包靜態(tài)文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang結(jié)構(gòu)體與json格式串實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了golang結(jié)構(gòu)體與json格式串的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
golang API請(qǐng)求隊(duì)列的實(shí)現(xiàn)
本文主要介紹了golang API請(qǐng)求隊(duì)列的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Go語(yǔ)言中內(nèi)建函數(shù)make的使用
在Go語(yǔ)言編程中,make函數(shù)是一個(gè)重要的內(nèi)建函數(shù),它用于創(chuàng)建和初始化切片、映射和通道,握 make 的使用方法,可以幫助我們更高效地管理內(nèi)存和數(shù)據(jù)結(jié)構(gòu)2024-09-09
對(duì)Golang中的runtime.Caller使用說(shuō)明
這篇文章主要介紹了對(duì)Golang中的runtime.Caller使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12

