Go打包附件內(nèi)容到執(zhí)行文件的方法
前言
如果我們的應(yīng)用在啟動(dòng)的時(shí)候需要對(duì)數(shù)據(jù)庫進(jìn)行初始化(比如建表等), 可以通過讀取.sql文件內(nèi)容直接執(zhí)行. 但是, 這樣會(huì)帶出一個(gè)問題:
- 在發(fā)送可執(zhí)行文件的時(shí)候, 需要連帶著附件文件, 并且相對(duì)路徑還不能出錯(cuò). 這樣太麻煩了
- 有時(shí)我們并不希望附件的內(nèi)容被使用者看到
處于種種原因, 我們不希望這部分額外的內(nèi)容以附件的形式出現(xiàn), 有沒有什么辦法能夠?qū)⒏郊?nèi)容直接打包進(jìn)可執(zhí)行文件中呢?
打包方法
直接在文件中定義
最容易想到的, 就是直接在.go文件中定義字符串, 比如這樣:
var text = `xxx`
如此處理必然是可以的, 但有些不方便.
.sql文件可能是通過mysqldump導(dǎo)出的, 每次導(dǎo)出之后還需要將內(nèi)容復(fù)制到.go文件中- 在編輯
.sql文件的時(shí)候,IDE會(huì)提供語法高亮及輸入提示, 這些在字符串中都是沒有的
通過工具轉(zhuǎn)換
既然我們想要將內(nèi)容直接放在文件中, 同時(shí)又想將內(nèi)容打包到二進(jìn)制中. 是否可以通過腳本處理呢? 腳本從附件中讀取內(nèi)容, 并寫入到.go文件中.
有一個(gè)名為go-bindata 的工具, 做的就是這樣的事情. 具體操作可自行搜索, 這里不做贅述.
但是這個(gè)工具在3年前就不再更新了, 為什么呢? 因?yàn)楣俜街С至?
go build
或許是因?yàn)檫@樣的呼聲太大, 在go 1.16版本開始, 官方增加了embed包對(duì)這種操作進(jìn)行了支持, 可以在編譯階段直接將靜態(tài)資源打包到二進(jìn)制中.
其大致用法如下:
import "embed"
// 將內(nèi)容直接打包到二進(jìn)制文件中
//go:embed test.txt
var test string
//go:embed test.txt
var test1 []byte
// 同時(shí)打包多個(gè)文件. 后接文件名或目錄
//go:embed test.txt dir
// 作為文件
var test2 embed.FS
func main() {
// 輸出文件內(nèi)容
println(test)
println(string(test1))
b, err := test2.ReadFile("test.txt")
if err != nil {
panic(err)
}
println(string(b))
}其中string/[]byte用來打包單個(gè)文件, embed.FS可以打包一批文件. 使用也比較簡單, 看下文檔就行了.
至此, Go程序已經(jīng)可以天然且方便的將資源文件進(jìn)行打包了.
總結(jié)
OK, 現(xiàn)在已經(jīng)完美解決了我們最開始的問題, 以后在項(xiàng)目中遇到類似的需求, 可以直接使用啦.
至于其他語言, 比如PHP/Python等, 本來就是一堆源文件, 不會(huì)打包成二進(jìn)制, 應(yīng)該也不會(huì)有這種需求吧.
到此這篇關(guān)于Go打包附件內(nèi)容到執(zhí)行文件的文章就介紹到這了,更多相關(guān)go打包附件內(nèi)容到執(zhí)行文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言CSP并發(fā)模型goroutine及channel底層實(shí)現(xiàn)原理
這篇文章主要為大家介紹了Go語言CSP并發(fā)模型goroutine?channel底層實(shí)現(xiàn)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Golang中Gin數(shù)據(jù)庫表名前綴的三種方法
本文主要介紹了Golang中Gin數(shù)據(jù)庫表名前綴的三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
Go語言集成開發(fā)環(huán)境IDE詳細(xì)安裝教程
VSCode是免費(fèi)開源的現(xiàn)代化輕量級(jí)代碼編輯器,支持幾乎所有主流的開發(fā)語言,內(nèi)置命令行工具和 Git 版本控制系統(tǒng),支持插件擴(kuò)展,這篇文章主要介紹了Go語言集成開發(fā)環(huán)境IDE詳細(xì)安裝教程,需要的朋友可以參考下2021-11-11
golang的匿名函數(shù)和普通函數(shù)的區(qū)別解析
匿名函數(shù)是不具名的函數(shù),可以在不定義函數(shù)名的情況下直接使用,通常用于函數(shù)內(nèi)部的局部作用域中,這篇文章主要介紹了golang的匿名函數(shù)和普通函數(shù)的區(qū)別,需要的朋友可以參考下2023-03-03
在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用
這篇文章主要介紹了在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用,來看下?Cobra?的使用,這里我們使用的?go1.13.3?版本,使用?Go?Modules?來進(jìn)行包管理,需要的朋友可以參考下2022-01-01

