脑洞golang embed 的使用场景
golang 的 embed 的功能真是一个很神奇的功能,它能把静态资源,直接在编译的时候,打包到最终的二进制程序中。
为什么会设计这么一个功能呢?我想和 golang 的崇尚简单的原则有关系吧。它希望的是一个二进制文件能走天下,那么如果你作为一个 web 服务器,还需要依赖一大堆的静态文件,终究不算是一人一天下,所以就提供了这么一种处理静态资源的办法。
golang 一旦提供了这种方式,可能会有哪些应用呢?我这里脑洞一下:
web 服务内嵌单页应用
目前的 web 应用很流行单页应用,基本上就一个 html+一个编译后的 js 就能搞定,那么我提供 web 服务器就直接通过 golang 编写,embed 方式将 html 和编译后的 js 内嵌到服务器中,那么就能很方便进行部署了。
app服务内嵌单页应用
同 web 服务一样,如果我使用 golang 写的是一个带有浏览器外框的 app 程序,内部使用 html+js进行渲染,那么岂不是这个服务就可以在手机/桌面端进行运行了?
可执行文件的版本管理
这下我们可以再仓库的根目录创建一个 version.txt, 里面填写上你的仓库的版本号,在项目中使用 embed 引入这个文件。如果你的项目是一个可执行文件,就能在执行的时候,直接显示出版本信息了。
可执行文件的git的commit显示
我们其实很希望知道我的这个可执行文件是对应 git 的哪个 commit,如果能将 .git 下的文件中的 commit 号直接 embed 到程序中就好了。
当然.git下的文件是不能直接 embed 的,但是这里提供了一种 generate+embed 的方式来实现:
Embedding Git Commit Information in Go Binaries
可执行文件的 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 语言 | 1.16 新增的embed在各流行Web框架中的应用
How can I embed hidden file in Go?
Embedding Git Commit Information in Go Binaries
脑洞golang embed 的使用场景的更多相关文章
- Golang适合高并发场景的原因分析
http://blog.csdn.NET/ghj1976/article/details/27996095 典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力. 360消息推送的数据 ...
- Golang 效率初(粗)测
从接触 Golang 开始,断断续续已有差不多一年左右的时间了,都是业余自己学学看看,尚主要限于语法及语言特性,还没有用它写过实际的项目. 关于 Golang 的语法及语言特性,网上有很多资源可以学习 ...
- 分水岭 golang入坑系列
第三式开篇语有些负面, 所以这里就不贴了.有兴趣的自己可以去看看 https://andy-zhangtao.gitbooks.io/golang/content/ .怒发冲冠,意气之作.看完就完了, ...
- golang 项目实战简明指南
原文地址 开发环境搭建 golang 的开发环境搭建比较简单,由于是编译型语言,写好 golang 源码后,只需要执行 go build 就能将源码编译成对应平台(本文中默认为 linux)上的可执行 ...
- 关于协程:nodejs和golang协程的不同
nodejs和golang都是支持协程的,从表现上来看,nodejs对于协程的支持在于async/await,golang对协程的支持在于goroutine.关于协程的话题,简单来说,可以看作是非抢占 ...
- 秒懂 Golang 中的 条件变量(sync.Cond)
本篇文章面向的读者: 已经基本掌握Go中的 协程(goroutine),通道(channel),互斥锁(sync.Mutex),读写锁(sync.RWMutex) 这些知识.如果对这些还不太懂,可以先 ...
- golang中关于死锁的思考与学习
1.Golang中死锁的触发条件 1.1 书上关于死锁的四个必要条件的讲解 发生死锁时,线程永远不能完成,系统资源被阻碍使用,以致于阻止了其他作业开始执行.在讨论处理死锁问题的各种方法之前,我们首先深 ...
- 【Network】高性能 UDP 应该怎么做?
参考资料: EPOLL-UDP-GOLANG golang udp epoll - Google 搜索 go - golang: working with multiple client/server ...
- goroutine 和 线程的区别
我们在使用Go语言进行开发时,一般会使用goroutine来处理并发任务.那么大家有没有考虑过goroutine的实现机制是什么样的?很多同学会把goroutine与线程等同起来,但是实际上并不是这样 ...
- Go学习路径--相关基础
现在开始接触Go一段时间了,基本路径就是看基础学习材料,开始写项目,有问题找解决问题的方法.这里记录一下学习过程. go相关文章 Golang适合高并发场景的原因分析 go build 不同系统下的可 ...
随机推荐
- 【Filament】基于物理的光照(PBR)
1 前言 自定义Blinn Phong光照模型中实现了基础的自定义光照,与现实的光照还是有些差别,本文将实现更逼真的光照效果,即基于物理的光照(PBR). 读者如果对 Filament 不太熟 ...
- Java对象引用和内存管理的细节
在Java中,当局部变量(比如方法参数)的作用域结束时,这个局部变量的引用确实不再存在,但这并不意味着它引用的对象会被销毁.对象的销毁是由Java的垃圾回收器(Garbage Collector, G ...
- HMAC算法:数据传输的保护神
HMAC算法起源: HMAC(Hash-based Message Authentication Code)算法是由Mihir Bellare.Ran Canetti和Hugo Krawczyk于19 ...
- 基于webpack与TypeScript的SolidJS项目搭建
本文将讲述如何基于webpack与TypeScript搭建一个基础的支持less模块的solidjs项目.方便后续涉及到solidjs相关分析与讨论都可以基于本文的成果之上进行. 前置 nodejs ...
- R语言安装教程
R 语言官方网站:The Comprehensive R Archive Network 官方镜像站列表:CRAN - Mirrors 一.官网下载R安装包 下载地址为:Index of /bin 进 ...
- 面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
写在开头 面试官:小伙子,多线程中锁用过吗? 我:那是自然! 面试官:那你知道synchronized的优化吗? 我:synchronized作为重锁,开销大,在早期不被推荐使用,后期进行了优化,至于 ...
- golang gc的内部优化
今天讲一个常见的gc compiler(也就是官方版本的go编译器和runtime)在垃圾回收的扫描标记阶段做的优化. 我对这个优化的描述印象最深的是在bigcache的注释里,大致内容是如果map的 ...
- 使用Go语言开发一个短链接服务:三、项目目录结构设计
章节 使用Go语言开发一个短链接服务:一.基本原理 使用Go语言开发一个短链接服务:二.架构设计 使用Go语言开发一个短链接服务:三.项目目录结构设计 使用Go语言开发一个短链接服务:四.生成 ...
- Java内存马2-Spring内存马
Spring内存马 目录 Spring内存马 1.Spring&Spring MVC简介 2.环境搭建 3.Controller内存马 4.踩坑日记 5.Interceptor内存马 1.Sp ...
- KingbaseES Insert On Conflict 功能
针对数据写入时有主键冲突的情况,INSERT ON CONFLICT语法可以将冲突主键的INSERT行为转换为UPDATE行为,从而实现冲突主键的覆盖写入.该特性又称UPSERT覆盖写,与MySQL的 ...