最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go1.16新特性embed打包靜態(tài)資源文件實(shí)現(xiàn)

 更新時(shí)間:2022年07月22日 15:09:20   作者:八兩  
這篇文章主要為大家介紹了Go?1.16新特性embed打包靜態(tài)資源文件的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

相信有一部分人喜愛 GO 的初衷大概是:跨平臺(tái)靜態(tài)編譯,如果在沒(méi)用通過(guò) CGO 引用其他庫(kù)的話,一般編譯出來(lái)的可執(zhí)行二進(jìn)制文件部署起來(lái)非常方便,但人們?cè)趯?shí)際中發(fā)現(xiàn),使用 Go 語(yǔ)言開發(fā)的后端 WEB 程序存在 HTML 模版、圖片、JS、CSS、JSON 等靜態(tài)資源,部署時(shí)需要把這些靜態(tài)資源與二進(jìn)制程序一起上傳到服務(wù)器部署,在現(xiàn)今遍地花容器的今天,為了簡(jiǎn)化部署流程,能不能更進(jìn)一步的把這些靜態(tài)文件與二進(jìn)制程序一起打包起來(lái)部署,那樣豈不是更方便?對(duì)運(yùn)維來(lái)說(shuō)打包一體化帶來(lái)的好處就是運(yùn)維復(fù)雜度的降低,對(duì)技術(shù)團(tuán)隊(duì)來(lái)說(shuō)打包一體化還可以保證程序完整性可控性。

因此,GO 社區(qū)發(fā)起了一個(gè)期望 Go 編譯器支持嵌入靜態(tài)文件的提案issue#35950?,F(xiàn)在,這個(gè)功能將隨著 1.16 版本一起發(fā)布,目前最新的版本是 Go 1.16 RC1 預(yù)覽版。

好了,接下來(lái)我們?cè)敿?xì)介紹 go embed 的各個(gè)功能。

embed 嵌入

└── cmd 測(cè)試目錄
    ├── assets 靜態(tài)資源目錄
    │?? ├── .idea.txt
    │?? ├── golang.txt
    │?? └── hello.txt
    └── main.go  測(cè)試go源文件

字符串、字節(jié)切片、文件嵌入

package main
import (
	"embed"
	_ "embed"
	"fmt"
)
//go:embed指令用來(lái)嵌入,必須緊跟著嵌入后的變量名
//只支持嵌入為string, byte slice和embed.FS三種類型,這三種類型的別名(alias)和命名類型(如type S string)都不可以
//以字符串形式嵌入 assets/hello.txt
//go:embed assets/hello.txt
var s string
//文件的內(nèi)容嵌入為slice of byte,也就是一個(gè)字節(jié)數(shù)組
//go:embed assets/hello.txt
var b []byte
//嵌入為一個(gè)文件系統(tǒng) 新的文件系統(tǒng)FS
//go:embed assets/hello.txt
//go:embed assets/golang.txt
var f embed.FS
func main() {
	fmt.Println("embed string.", s)
	fmt.Println("embed byte.", string(b))
	data, _ := f.ReadFile("assets/hello.txt")
	fmt.Println("embed fs.", string(data))
	data, _ = f.ReadFile("assets/golang.txt")
	fmt.Println("embed fs.", string(data))
}

編譯運(yùn)行后輸出:

embed string. hello golang!
embed byte. hello golang!
embed fs. hello golang!
embed fs. hello!

從上面的代碼可以看出,embed 支持嵌入為 string,byte slice 和 embed.FS 這三種類型,另外也不允許從這些類型中派生哦。

嵌入文件

對(duì)于 FS 類型的嵌入,也可以支持一個(gè)變量嵌入多個(gè)文件。

//go:embed assets/hello.txt
//go:embed assets/golang.txt
var f embed.FS

當(dāng)然也支持,兩個(gè)變量嵌入一個(gè)文件。雖然兩個(gè)變量嵌入了同一個(gè)文件,但它們?cè)诰幾g的時(shí)候會(huì)獨(dú)立分配,彼此之間并不會(huì)互相影響。

嵌入文件夾

FS 類型的嵌入支持文件夾.分隔符采用正斜杠/,即使是 windows 系統(tǒng)也采用這個(gè)模式。

//go:embed assets
var f embed.FS
func main() {
	data, _ := f.ReadFile("assets/hello.txt")
	fmt.Println(string(data))
}

嵌入匹配

go:embed 指令中可以只寫文件夾名,此文件夾中除了.和_開頭的文件和文件夾都會(huì)被嵌入,并且子文件夾也會(huì)被遞歸的嵌入,形成一個(gè)此文件夾的文件系統(tǒng)。

如果想嵌入.和_開頭的文件和文件夾, 比如.hello.txt 文件,那么就需要使用*,比如 go:embed assets/*。

不具有遞歸性,所以子文件夾下的.和_不會(huì)被嵌入,除非你在專門使用子文件夾的進(jìn)行嵌入:

├── assets
│?? ├── .idea.txt
│?? ├── golang.txt
│?? └── hello.txt
└── main.go
package main
import (
	"embed"
	_ "embed"
	"fmt"
)
//go:embed assets/*
var f embed.FS
func main() {
	data, _ := f.ReadFile("assets/.idea.txt")
	fmt.Println(string(data))
}

FS 文件系統(tǒng)

embed.FS 實(shí)現(xiàn)了 io/fs.FS 接口,它可以打開一個(gè)文件,返回 fs.File:

package main
import (
	"embed"
	_ "embed"
	"fmt"
)
//go:embed assets
var f embed.FS
func main() {
	helloFile, _ := f.Open("assets/hello.txt")
	stat, _ := helloFile.Stat()
	fmt.Println(stat.Name(), stat.Size())
}

它還提供了 ReadFileh 和 ReadDir 功能,遍歷一個(gè)文件下的文件和文件夾信息:

package main
import (
	"embed"
	_ "embed"
	"fmt"
)
//go:embed assets
var f embed.FS
func main() {
	dirEntries, _ := f.ReadDir("assets")
	for _, de := range dirEntries {
		fmt.Println(de.Name(), de.IsDir())
	}
}

因?yàn)樗鼘?shí)現(xiàn)了 io/fs.FS 接口,所以可以返回它的子文件夾作為新的文件系統(tǒng):

package main
import (
	"embed"
	_ "embed"
	"fmt"
	"io/fs"
	"io/ioutil"
)
//go:embed assets
var f embed.FS
func main() {
	as, _ := fs.Sub(f, "assets")
	hi, _ := as.Open("hello.txt")
	data, _ := ioutil.ReadAll(hi)
	fmt.Println(string(data))
}

總結(jié):

  • 對(duì)于單個(gè)的文件,支持嵌入為字符串和 byte slice
  • 對(duì)于多個(gè)文件和文件夾,支持嵌入為新的文件系統(tǒng) FS
  • go:embed 指令用來(lái)嵌入,必須緊跟著嵌入后的變量名
  • 只支持嵌入為 string, byte slice 和 embed.FS 三種類型,類型派生也不可以。

以上就是Go 1.16新特性embed打包靜態(tài)資源文件實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Go embed打包靜態(tài)資源的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang中字符串MD5生成方式總結(jié)

    golang中字符串MD5生成方式總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于golang中字符串MD5生成方式總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換

    GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換

    這篇文章主要為大家介紹了GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go語(yǔ)言靜態(tài)庫(kù)的編譯和使用方法

    go語(yǔ)言靜態(tài)庫(kù)的編譯和使用方法

    這篇文章主要介紹了go語(yǔ)言靜態(tài)庫(kù)的編譯和使用方法,本文以windows平臺(tái)為例,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • GoLang OS包以及File類型詳細(xì)講解

    GoLang OS包以及File類型詳細(xì)講解

    go中對(duì)文件和目錄的操作主要集中在os包中,下面對(duì)go中用到的對(duì)文件和目錄的操作,做一個(gè)總結(jié)筆記。在go中的文件和目錄涉及到兩種類型,一個(gè)是type File struct,另一個(gè)是type Fileinfo interface
    2023-03-03
  • Golang執(zhí)行g(shù)o get私有庫(kù)提示

    Golang執(zhí)行g(shù)o get私有庫(kù)提示"410 Gone" 的問(wèn)題及解決辦法

    這篇文章主要介紹了Golang執(zhí)行g(shù)o get私有庫(kù)提示”410 Gone“ 解決辦法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Go語(yǔ)言切片常考的面試真題解析

    Go語(yǔ)言切片??嫉拿嬖囌骖}解析

    了解最新的Go語(yǔ)言面試題型,讓面試不再是難事,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言切片面試常考的一些問(wèn)題,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • Golang基于Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密

    Golang基于Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密

    數(shù)據(jù)加密是主要的數(shù)據(jù)安全防護(hù)技術(shù)之一,敏感數(shù)據(jù)應(yīng)該加密存儲(chǔ)在數(shù)據(jù)庫(kù)中,降低泄露風(fēng)險(xiǎn),本文將介紹一下利用Vault實(shí)現(xiàn)敏感數(shù)據(jù)加解密的方法,需要的可以參考一下
    2023-07-07
  • Go語(yǔ)言開發(fā)中redis的使用詳解

    Go語(yǔ)言開發(fā)中redis的使用詳解

    這篇文章主要介紹了Go語(yǔ)言開發(fā)中redis的使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Golang搭建開發(fā)環(huán)境的圖文教程

    Golang搭建開發(fā)環(huán)境的圖文教程

    這篇文章主要介紹了Golang搭建開發(fā)環(huán)境,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼

    golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼

    這篇文章主要介紹了golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論

鄂托克旗| 潞城市| 卢氏县| 木里| 贡觉县| 长沙市| 黄浦区| 鄂托克前旗| 洪湖市| 金坛市| 略阳县| 成武县| 巴马| 大邑县| 新巴尔虎左旗| 酒泉市| 沂南县| 陆良县| 抚远县| 博罗县| 陆河县| 霍城县| 新宁县| 华阴市| 运城市| 十堰市| 乌兰县| 吉首市| 会理县| 大连市| 枣庄市| 玛曲县| 富裕县| 古田县| 兴义市| 保山市| 鲁甸县| 广河县| 仲巴县| 同心县| 南郑县|