Go1.16 新特性:一文快速上手 Go embed_煎鱼(EDDYCJY)的博客-CSDN博客


本站和网页 https://blog.csdn.net/EDDYCJY/article/details/113577812 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Go1.16 新特性:一文快速上手 Go embed_煎鱼(EDDYCJY)的博客-CSDN博客
Go1.16 新特性:一文快速上手 Go embed
煎鱼(EDDYCJY)
于 2021-02-02 08:59:16 发布
3507
收藏
文章标签:
编程语言
python
java
css
go
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/EDDYCJY/article/details/113577812
版权
大家好,我是正在沉迷学习煎鱼的煎鱼。
在以前,很多从其他语言转过来 Go 语言的同学会问到,或是踩到一个坑。就是以为 Go 语言所打包的二进制文件中会包含配置文件的联同编译和打包。
结果往往一把二进制文件挪来挪去,就无法把应用程序运行起来了。因为无法读取到静态文件的资源。
无法将静态资源编译打包进二进制文件的话,通常会有两种解决方法:
第一种是识别这类静态资源,是否需要跟着程序走。第二种就是考虑将其打包进二进制文件中。
第二种情况的话,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 正式提供的 embed 特性,可以实现原生就支持静态资源文件的嵌入。整体如下:
在功能上:能够将静态资源嵌入二进制文件中,在运行时可以打开和读取相关的打包后的静态文件。在安全上:是在编译期编译嵌入,在运行时不支持修改。在使用上:支持单文件读取:go:embed hello.txt。支持多文件读取:go:embed hello1.txt、go:embed hello2.txt。支持目录读取:go:embed helloworld。支持贪婪匹配:go:embed helloworld/*。
总的来讲,Go1.16 embed 特性很好的填补了 Go 语言在打包静态文件资源的一块原生空白领域。同时也说明了 Go 官方的确在不断地吸收社区的一些良好的想法和经验。
分享 Go 语言、微服务和奇怪的系统设计
???? 长按关注煎鱼,在知识的海洋里遨游
学习资料分享,关注公众号回复指令:
回复【000】,下载 LeetCode 题解大全。回复【001】,下载 Go 进阶图书 Mastering Go。
煎鱼(EDDYCJY)
关注
关注
点赞
收藏
打赏
知道了
评论
Go1.16 新特性:一文快速上手 Go embed
大家好,我是正在沉迷学习煎鱼的煎鱼。在以前,很多从其他语言转过来 Go 语言的同学会问到,或是踩到一个坑。就是以为 Go 语言所打包的二进制文件中会包含配置文件的联同编译和打包。结果往往...
复制链接
扫一扫
go-php:用于Go编程语言(Golang)PHP绑定
02-03
GoPHP绑定
该软件包实现了对以下方面的支持:执行PHP脚本,导出Go变量以在PHP上下文中使用,将Go方法接收者附加为PHP类以及返回PHP变量以在Go上下文中使用。
PHP 5.x和PHP 7.x系列均受支持。
建造
构建此程序包要求您已将PHP安装为库。 对于大多数Linux系统,通常可以在php-embed软件包或其变体中找到它。
一旦PHP库可用,就可以使用go build和go get -able来编译绑定。
注意:针对PHP 5.x构建需要提供php5标签,即:
go get -tags php5 github.com/deuill/go-php
这是因为PHP 7.x是默认的构建目标。
状态
支持并稳定执行PHP以及。
大多数基本类型都允许将为PHP变量,并且可以转换从评估字符串返回PHP值并将其在Go上下文中用作interface{}值。
可以作为PHP类,并完全支持调用过期的方法,以及获取和设置嵌入字段(对于struct -type方法的接收者)。
注意事项
请注意,默认情况下,如果不是使用构建的,则PHP并非设计用于多线程环境(严格限制了Goro
Go-go-embed-生成的Go代码来嵌入资源文件到你的库或可执行文件中
08-13
go-embed - 生成的Go代码来嵌入资源文件到你的库或可执行文件中
1 条评论
您还未登录,请先
登录
后发表或查看评论
GolangGuide:本项目是对Go语言内容的梳理,包括Go语言基础,常用框架以及系统设计等。涉及到的知识点用demo的形式帮助您快速上手
02-20
GolangGuide
高朗发展历史
{%embed url =“ }
项目介绍
本项目是对Go语言内容的梳理,包括Go语言基础与常用框架。涉及到的知识点用demo的形式帮助您快速上手。
推荐资源
[1]
[2]语言学习资料与社区索引: :
[3]进行开发人员路线图: :
[4]
[5]
协议
除特别声明外,本书中的内容使用(创作共享署名-相同方式共享3.0许可协议)授权,代码包含(3项条款的BSD许可协议)。
Go-embed:另一个Golang静态内容嵌入器
08-14
embed: 另一个Golang静态内容嵌入器
embed-example:Go1.16的新功能使用示例
05-29
embed-example
Go1.16的新功能使用示例
Go embed 简明教程
笔记
03-26
2840
转载地址:Go embed 简明教程
Go编译的程序非常适合部署,如果没有通过CGO引用其它的库的话,我们一般编译出来的可执行二进制文件都是单个的文件,非常适合复制和部署。在实际使用中,除了二进制文件,可能还需要一些配置文件,或者静态文件,比如html模板、静态的图片、CSS、javascript等文件,如何这些文件也能打进到二进制文件中,那就太美妙,我们只需复制、按照单个的可执行文件即可。
一些开源的项目很久以前就开始做这方面的工作,比如gobuffalo/packr、markbates/pkger、
Go Embed简明教程
AndrewYZWang的博客
09-26
1144
Go Embed简明教程
go语言程序都是编译成二进制可执行文件的,但是实际执行时除了需要可执行程序,还需要一些静态文件,比如html模板等,于是就有人想如果Go官方能内建支持就好了。2019末一个提案被提出 issue#35950,期望Go官方编译器支持嵌入静态文件。后来Russ Cox专门写了一个设计文档 Go command support for embedded static assets, 并最终实现了它。
需要注意的这个功能在go 1.16beta之后才支持
对于单个的文件,支持嵌入为
Golang 1.16 新特性-embed 包及其使用
云满笔记
10-11
916
请记住, 在您希望在 Web 服务器中嵌入文件但不允许用户查看所有文件的列表的情况下, 包含 Mac OS 的。将文件内容嵌入到字符串或字节数组类型变量的时候, 只能嵌入 1 个文件, 不能嵌入多个文件, 并且文件名不支持正则模式, 否则运行代码会报错。嵌入的这个基本概念是通过在代码里添加一个特殊的注释实现的, Go 会根据这个注释知道要引入哪个或哪几个文件。指令, 可以在编译阶段将静态资源文件打包进编译好的程序中, 并提供访问这些文件的能力。指令, 可以在同一个变量中嵌入多个目录。
golang的go:embed的使用注意事项
风之飘渺
08-26
1132
golang的go:embed的使用注意事项,避坑指南。
go:embed 的使用
DisMisPres的博客
10-09
3771
简介
go:embed 是 go 1.16版本添加的新特性,可以在 go 生成的应用程序中嵌入静态文件(文件,文件夹)。部署的时候,直接扔一个二进制文件即可,不用再包含一些静态文件,考虑文件相对位置,因为它们已经被打包到生成的应用程序中了。
导入 embed 的 go 源文件可以使用 //go:embed 指令在编译时从包目录或子目录中将读取的内容转换成 string, []byte, 或者 embed.FS 类型的变量。
基本用法
目录层级:
下面用到的 hello.txt 的内容:
hello wor
cnych#qikqiak.com#golang1.16使用embed嵌入静态资源1
07-25
假设 Gin 项目下需要使用静态资源以及 Template 视图模板,结构如下所示:现在我们利用 embed 就可以将上面的 templates 和 asset
exif:libexif的Golang(Go)绑定
04-26
libexif的Go(golang)绑定提供基本支持,以使用和CGO读取文件上的EXIF标记。如何安装为您的操作系统获取libexif: # OSXbrew install libexif# Debianapt-get install -y libexif-dev# RedHatdnf install -y ...
[Golang] go mod及module path初级探究
01-07
今天读了golang官方文档中的module介绍 https://blog.golang.org/using-go-modules 从go1.11之后,Google应该是想把module变成正统包管理器了。在此,我简单的以工程角度探究一下mod。 首先,文档提到: A module is...
debme:从embed.FS内部获取embed.FS
04-16
da! 听说您喜欢embed.FS ... 特征 提供一种从嵌入式目录获取embed.FS的方法 一种方法: FS() 您可以一直调用FS() ,直到... 100% embed.FS兼容 100%的代码覆盖率 例子 package main ...//go:embed fix
migration:Go应用程序的简单实用迁移
05-03
支持使用Go代码进行迁移车手阿帕奇凤凰Golang(运行通用的go函数) MySQL PostgreSQLSQLite的快速开始// Create migration source//go:embed migrationsvar embedFS embed. FSembedSource := & migration. ...
Go 语言 | 1.16 新增的embed在各流行Web框架中的应用
flysnow_org的博客
03-01
4445
点击上方蓝色“飞雪无情”关注我,设个星标,第一时间看文章什么是 Go embed在前几天刚发布的Golang 1.16版本中,新增了一个大家期待已久的特性//go:embed,它的作用就是...
【Go语言】gin + go:embed 打包静态资源文件
Regulations的博客
02-02
277
【代码】【Go语言】gin + go:embed 打包静态资源文件。
体验Go 1.16版本中的embed(文件嵌入) | Gopher Daily (2021.01.28) ʕ◔ϖ◔ʔ
TonyBai
01-28
606
每日一谚:"You haven't mastered a tool until you understand when it should not be used.&#3...
go embed结合viper 打包静态配置文件到二进制文件
shelutai的博客
09-29
281
go embed结合viper 打包静态配置文件到二进制文件
使用embed加音频文件:music.wav
最新发布
03-16
使用embed标签可以将音频文件music.wav嵌入到网页中,让用户可以直接在网页上播放音频。具体操作步骤如下:
1. 在网页中添加embed标签,代码如下:
<embed src="music.wav" width="300" height="40" autostart="false" />
2. 在src属性中指定音频文件的路径,这里是music.wav。
3. 设置width和height属性,指定音频播放器的宽度和高度。
4. 设置autostart属性为false,表示不自动播放音频。
5. 保存网页,打开网页即可在网页上播放音频文件。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
煎鱼(EDDYCJY)
CSDN认证博客专家
CSDN认证企业博客
码龄8年
暂无认证
271
原创
2万+
周排名
4622
总排名
40万+
访问
等级
4513
积分
509
粉丝
183
获赞
69
评论
654
收藏
私信
关注
热门文章
bash: vue: command not found
21752
bash: scrapy: command not found
11997
yum安装rsync
11881
【CentOS】修改$PATH环境变量
8331
Go 面试官:什么是协程,协程和线程的区别和联系?
7663
分类专栏
YII2
10篇
技巧学习
7篇
Linux
3篇
Mysql
3篇
PHP源码
Python
3篇
Mongo
2篇
docker
最新评论
Go 切片导致内存泄露,被坑两次了!
不爱学习的王小小:
下面的例子,直接返回c,不操作a是不是可以
错过后悔系列,这简直是 Golang 命脉级别的干货资料合集
半世琉璃742:
您好,博客里面的二维码看不了了,请问博主能重新发一下,或者我还可以通过其他哪些途径加一下呢?谢谢!
Go Gin 系列十:定制 GORM Callbacks
今天就努力:
[code=golang]
func updateTimeStampForUpdateCallback(scope *gorm.Scope) {
if _, ok := scope.Get("gorm:update_column"); !ok {
scope.SetColumn("ModifiedOn", time.Now().Unix())
[/code]
推荐这位 Go 资深大佬!
韜の道:
真大佬还得看煎鱼
跟读者聊 Goroutine 泄露的 N 种方法,真刺激!
被一米六支配的恐惧:
作者你好,请问在接受不发送的例子中,var ch chan struct{} 这是定义ch是channnel类型吧?并没有真正的初始化分配内存.所以接受不发送的例子,和nil
channel的例子代码是不是也有相同的情况?都是nil channel? 而且chan在`没初始化的时候是无法向内部写入数据的.所以俩案例是代码敲错了?还是我理解错了?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
快速上手 Go CGO,掌握在 Go 里写 C!
外观模式,一个每天都在用,却被多数人在面试中忽视的模式
听说 DNS 根服务器只有13台,科学吗?
2023
04月
11篇
03月
11篇
02月
12篇
01月
6篇
2022年208篇
2021年288篇
2020年49篇
2019年18篇
2017年13篇
2015年10篇
目录
目录
分类专栏
YII2
10篇
技巧学习
7篇
Linux
3篇
Mysql
3篇
PHP源码
Python
3篇
Mongo
2篇
docker
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
红包个数最小为10个
红包总金额
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
打赏作者
煎鱼(EDDYCJY)
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值