溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用Go1.16的新特性

發(fā)布時間:2021-10-19 15:05:30 來源:億速云 閱讀:115 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“如何使用Go1.16的新特性”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

無法將靜態(tài)資源編譯打包進二進制文件的話,通常會有兩種解決方法:

  • 第一種是識別這類靜態(tài)資源,是否需要跟著程序走。

  • 第二種就是考慮將其打包進二進制文件中。

第二種情況的話,Go 以前是不支持的,大家就會去借助各種花式的開源庫,例如:go-bindata/go-bindata 來實現(xiàn)。

但從在 Go1.16 起,Go 語言自身正式支持了該項特性,今天我們將通過這篇文章快速了解和學(xué)習(xí)這項特性。

基本使用

演示代碼:

import _ "embed"  //go:embed hello.txt var s string  func main() {  print(s) }

我們首先在對應(yīng)的目錄下創(chuàng)建了 hello.txt 文件,并且寫入文本內(nèi)容 “吃煎魚”。

在代碼中編寫了最為核心的 //go:embed hello.txt 注解。注解的格式很簡單,就是 go:embed  指令聲明,外加讀取的內(nèi)容的地址,可支持相對和絕對路徑。

輸出結(jié)果:

吃煎魚

讀取到靜態(tài)文件中的內(nèi)容后自動賦值給了變量 s,并且在主函數(shù)中成功輸出。

而針對其他的基礎(chǔ)類型,Go embed 也是支持的:

//go:embed hello.txt var s string  //go:embed hello.txt var b []byte  //go:embed hello.txt var f embed.FS  func main() {  print(s)  print(string(b))   data, _ := f.ReadFile("hello.txt")  print(string(data)) }

輸出結(jié)果:

吃煎魚 吃煎魚 吃煎魚

我們同時在一個代碼文件中進行了多個 embed 的注解聲明。

并且針對 string、slice、byte、fs 等多種類型進行了打包,也不需要過多的處理,非常便利。

拓展用法

除去基本用法完,embed 本身在指令上也支持多種變形:

//go:embed hello1.txt hello2.txt var f embed.FS  func main() {  data1, _ := f.ReadFile("hello1.txt")  fmt.Println(string(data1))   data2, _ := f.ReadFile("hello2.txt")  fmt.Println(string(data2)) }

在指定 go:embed 注解時可以一次性多個文件來讀取,并且也可以一個變量多行注解:

//go:embed hello1.txt  //go:embed hello2.txt var f embed.FS

也可以通過在注解中指定目錄 helloworld,再對應(yīng)讀取文件:

//go:embed helloworld var f embed.FS  func main() {  data1, _ := f.ReadFile("helloworld/hello1.txt")  fmt.Println(string(data1))   data2, _ := f.ReadFile("helloworld/hello2.txt")  fmt.Println(string(data2)) }

同時既然能夠支持目錄讀取,也能支持貪婪模式的匹配:

//go:embed helloworld/* var f embed.FS

可能會有小伙伴注意到,embed.FS 也能調(diào)各類文件系統(tǒng)的接口,其實本質(zhì)是 embed.FS 實現(xiàn)了 io/fs 接口。

只讀屬性

在 embed 所提供的 FS 中,我們可以發(fā)現(xiàn)其都是打開和只讀方法:

type FS     func (f FS) Open(name string) (fs.File, error)     func (f FS) ReadDir(name string) ([]fs.DirEntry, error)     func (f FS) ReadFile(name string) ([]byte, error)

根據(jù)此也可以確定 embed 所打包進二進制文件的內(nèi)容只允許讀取,不允許變更。

更抽象來講就是在編譯期就確定了 embed 的內(nèi)容,在運行時不允許修改,保證了一致性。

“如何使用Go1.16的新特性”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI