文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go1.16 新特性:一文快速上手 Go embed

2024-12-03 11:28

关注

本文转载自微信公众号「脑子进煎鱼了」,作者陈煎鱼。转载本文请联系脑子进煎鱼了公众号。   

大家好,我是正在沉迷学习煎鱼的煎鱼。

在以前,很多从其他语言转过来 Go 语言的同学会问到,或是踩到一个坑。就是以为 Go 语言所打包的二进制文件中会包含配置文件的联同编译和打包。

结果往往一把二进制文件挪来挪去,就无法把应用程序运行起来了。因为无法读取到静态文件的资源。

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

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

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

基本使用

演示代码:

  1. import _ "embed" 
  2.  
  3. //go:embed hello.txt 
  4. var s string 
  5.  
  6. func main() { 
  7.  print(s) 

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

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

输出结果:

  1. 吃煎鱼 

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

而针对其他的基础类型,Go embed 也是支持的:

  1. //go:embed hello.txt 
  2. var s string 
  3.  
  4. //go:embed hello.txt 
  5. var b []byte 
  6.  
  7. //go:embed hello.txt 
  8. var f embed.FS 
  9.  
  10. func main() { 
  11.  print(s) 
  12.  print(string(b)) 
  13.  
  14.  data, _ := f.ReadFile("hello.txt"
  15.  print(string(data)) 

输出结果:

  1. 吃煎鱼 
  2. 吃煎鱼 
  3. 吃煎鱼 

我们同时在一个代码文件中进行了多个 embed 的注解声明。

并且针对 string、slice、byte、fs 等多种类型进行了打包,也不需要过多的处理,非常便利。

拓展用法

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

  1. //go:embed hello1.txt hello2.txt 
  2. var f embed.FS 
  3.  
  4. func main() { 
  5.  data1, _ := f.ReadFile("hello1.txt"
  6.  fmt.Println(string(data1)) 
  7.  
  8.  data2, _ := f.ReadFile("hello2.txt"
  9.  fmt.Println(string(data2)) 

在指定 go:embed 注解时可以一次性多个文件来读取,并且也可以一个变量多行注解:

  1. //go:embed hello1.txt  
  2. //go:embed hello2.txt 
  3. var f embed.FS 

也可以通过在注解中指定目录 helloworld,再对应读取文件:

  1. //go:embed helloworld 
  2. var f embed.FS 
  3.  
  4. func main() { 
  5.  data1, _ := f.ReadFile("helloworld/hello1.txt"
  6.  fmt.Println(string(data1)) 
  7.  
  8.  data2, _ := f.ReadFile("helloworld/hello2.txt"
  9.  fmt.Println(string(data2)) 

同时既然能够支持目录读取,也能支持贪婪模式的匹配:

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

可能会有小伙伴注意到,embed.FS 也能调各类文件系统的接口,其实本质是 embed.FS 实现了 io/fs 接口。

只读属性

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

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

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

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

总结

总的来讲,Go1.16 embed 特性很好的填补了 Go 语言在打包静态文件资源的一块原生空白领域。同时也说明了 Go 官方的确在不断地吸收社区的一些良好的想法和经验。

 

来源: 脑子进煎鱼了内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯