如何使用Go1.16的新特性

本篇内容介绍了“如何使用Go1.16的新特性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

专注于为中小企业提供成都做网站、成都网站设计、成都外贸网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业九江免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

无法将静态资源编译打包进二进制文件的话,通常会有两种解决方法:

  • 第一种是识别这类静态资源,是否需要跟着程序走。

  • 第二种就是考虑将其打包进二进制文件中。

第二种情况的话,Go 以前是不支持的,大家就会去借助各种花式的开源库,例如:go-bindata/go-bindata 来实现。

但从在 Go1.16 起,Go 语言自身正式支持了该项特性,今天我们将通过这篇文章快速了解和学习这项特性。

基本使用

演示代码:

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

我们首先在对应的目录下创建了 hello.txt 文件,并且写入文本内容 “吃煎鱼”。

在代码中编写了最为核心的 //go:embed hello.txt 注解。注解的格式很简单,就是 go:embed  指令声明,外加读取的内容的地址,可支持相对和绝对路径。

输出结果:

吃煎鱼

读取到静态文件中的内容后自动赋值给了变量 s,并且在主函数中成功输出。

而针对其他的基础类型,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)) }

输出结果:

吃煎鱼 吃煎鱼 吃煎鱼

我们同时在一个代码文件中进行了多个 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,再对应读取文件:

//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 也能调各类文件系统的接口,其实本质是 embed.FS 实现了 io/fs 接口。

只读属性

在 embed 所提供的 FS 中,我们可以发现其都是打开和只读方法:

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)

根据此也可以确定 embed 所打包进二进制文件的内容只允许读取,不允许变更。

更抽象来讲就是在编译期就确定了 embed 的内容,在运行时不允许修改,保证了一致性。

“如何使用Go1.16的新特性”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


分享名称:如何使用Go1.16的新特性
链接分享:http://ybzwz.com/article/jedecg.html