golang的embed功能是一项非常神奇的功能,它可以在编译时将静态资源直接打包到最终的二进制程序中。
为什么会设计这样的功能呢?我认为这可能与golang所崇尚的简洁原则有关。它希望一个二进制文件能够独立运行,如果作为web服务器还需要依赖大量静态文件,就无法实现这一点。因此,golang提供了这种处理静态资源的方法。
一旦golang提供了这种方式,可能会有哪些应用呢?我在这里进行一些设想:
web服务内嵌单页应用
当前的web应用非常流行单页应用,基本上只需要一个html和一个编译后的js就能完成。因此,如果我使用golang编写web服务器,并通过embed方式将html和编译后的js内嵌到服务器中,部署将变得非常方便。
app服务内嵌单页应用
与web服务类似,如果我使用golang编写一个带有浏览器外框的app程序,内部使用html+js进行渲染,那么这个服务就可以在手机或桌面端运行。
可执行文件的版本管理
现在我们可以在仓库的根目录创建一个version.txt文件,其中填写仓库的版本号,并在项目中使用embed引入这个文件。如果项目是一个可执行文件,就能在执行时直接显示版本信息。
可执行文件的git commit显示
我们希望知道可执行文件对应的git commit,如果能直接将.git目录下的文件中的commit号embed到程序中就好了。虽然不能直接embed.git目录下的文件,但可以通过generate+embed的方式实现。
可执行文件的readme
以前,在输入help时,一个可执行文件需要显示一些信息内容,而在git项目外也需要有一个readme,实际上两者都是对项目的帮助。现在,可以使用embed将两者合而为一。
licence注入
我不确定golang的二进制程序是否容易被反编译,但是将licence编译进入二进制程序相对于简单的licence发放已经更加安全。如果要控制某个程序的发行,可以在给用户编译二进制程序时,将对应的licence以embed的形式编译进去,然后在程序运行时,通过远程或本地使用非对称解密等方式验证licence的合法性。
提高性能
我们可以将一些中间结果,比如xxx预计算模型等,以embed的形式内嵌进程序。程序运行时,就能将这些中间结构和预计算模型反序列化出来。
tEMPlate文件进行embed
以前使用golang的template时,往往需要创建一个很大的template变量,而这个变量往往就是html或txt。现在可以将这些html或txt放在git仓库中,在编译时embed进去,部署时直接使用。
参考
//go:embed 入门
Go语言 | 1.16新增的embed在各流行Web框架中的应用
道理我都懂,但go embed究竟该怎么用?
Go embed简明教程
How can I embed hidden file in Go?
Embedding Git Commit Information in Go Binaries