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: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

脑洞golang embed 的使用场景的更多相关文章

  1. Golang适合高并发场景的原因分析

    http://blog.csdn.NET/ghj1976/article/details/27996095 典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力. 360消息推送的数据 ...

  2. Golang 效率初(粗)测

    从接触 Golang 开始,断断续续已有差不多一年左右的时间了,都是业余自己学学看看,尚主要限于语法及语言特性,还没有用它写过实际的项目. 关于 Golang 的语法及语言特性,网上有很多资源可以学习 ...

  3. 分水岭 golang入坑系列

    第三式开篇语有些负面, 所以这里就不贴了.有兴趣的自己可以去看看 https://andy-zhangtao.gitbooks.io/golang/content/ .怒发冲冠,意气之作.看完就完了, ...

  4. golang 项目实战简明指南

    原文地址 开发环境搭建 golang 的开发环境搭建比较简单,由于是编译型语言,写好 golang 源码后,只需要执行 go build 就能将源码编译成对应平台(本文中默认为 linux)上的可执行 ...

  5. 关于协程:nodejs和golang协程的不同

    nodejs和golang都是支持协程的,从表现上来看,nodejs对于协程的支持在于async/await,golang对协程的支持在于goroutine.关于协程的话题,简单来说,可以看作是非抢占 ...

  6. 秒懂 Golang 中的 条件变量(sync.Cond)

    本篇文章面向的读者: 已经基本掌握Go中的 协程(goroutine),通道(channel),互斥锁(sync.Mutex),读写锁(sync.RWMutex) 这些知识.如果对这些还不太懂,可以先 ...

  7. golang中关于死锁的思考与学习

    1.Golang中死锁的触发条件 1.1 书上关于死锁的四个必要条件的讲解 发生死锁时,线程永远不能完成,系统资源被阻碍使用,以致于阻止了其他作业开始执行.在讨论处理死锁问题的各种方法之前,我们首先深 ...

  8. 【Network】高性能 UDP 应该怎么做?

    参考资料: EPOLL-UDP-GOLANG golang udp epoll - Google 搜索 go - golang: working with multiple client/server ...

  9. goroutine 和 线程的区别

    我们在使用Go语言进行开发时,一般会使用goroutine来处理并发任务.那么大家有没有考虑过goroutine的实现机制是什么样的?很多同学会把goroutine与线程等同起来,但是实际上并不是这样 ...

  10. Go学习路径--相关基础

    现在开始接触Go一段时间了,基本路径就是看基础学习材料,开始写项目,有问题找解决问题的方法.这里记录一下学习过程. go相关文章 Golang适合高并发场景的原因分析 go build 不同系统下的可 ...

随机推荐

  1. Langchain 介绍与入门

    官方介绍 LangChain 是一个利用LLM开发应用程序的框架.它让应用程序具备: 上下文感知能力:将LLM连接到上下文源(提示说明.少量示例.用以形成其响应的内容等) 推理:依靠LLM进行推理(例 ...

  2. 图数据库 Nebula Graph 的代码变更测试覆盖率实践

    对于一个持续开发的大型工程而言,足够的测试是保证软件行为符合预期的有效手段,而不是仅仅依靠 code review 或者开发者自己的技术素质.测试的编写理想情况下应该完全定义软件的行为,但是通常情况都 ...

  3. 从 Neo4j 导入 Nebula Graph 实践见 SPark 数据导入原理

    本文主要讲述如何使用数据导入工具 Nebula Graph Exchange 将数据从 Neo4j 导入到 Nebula Graph Database.在讲述如何实操数据导入之前,我们先来了解下 Ne ...

  4. 003-Java程序流程控制

    3. Java程序流程控制(重点) 程序的三种控制结构 3.1 分支结构 if, switch 3.1.1 if if 分支 根据条件(真或假)来决定执行某段代码. if分支应用场景 if 第一种形式 ...

  5. Android APP 渗透测试---总结

    1.apk反编译得到源代码 使用编译软件 dex2gar 和 jdgui.jar 对Android APP软件进行反编译.具体步骤如下: (1)首先将APK文件后缀改为zip并解压,得到其中的clas ...

  6. Java自定义注解校验枚举值类型参数

    项目开发中会经常使用到各种枚举值,枚举值一般都是固定的,不会随意改变其中的值. 比如性别分为男女,确定之后一般都不会轻易改变,这时候使用枚举值就非常地方便.很多 时候,在页面中传入的参数就是枚举值中的 ...

  7. 简单实用算法——位图算法(BitMap)

    目录 算法原理 优点和缺点 算法实现(C#) 算法应用 参考文章 算法原理 BitMap的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素.由于采用了Bit为单位来存储数据 ...

  8. 数据处理——IF函数求同时满足多个条件 多个条件满足一个以上

    以满足两个条件为例,满足多个条件类似 以如下案例为例进行说明: 一.IF公式同时满足多个条件 此例也可使用函数的嵌套,对于函数使用掌握不牢的新手,嵌套使用会有些困难,以下方法针对刚入门学习参考 1.利 ...

  9. 如何用LOTO示波器实测LC串联谐振?

    一个电感和一个电容串联,在某个特定的频率,就会发生谐振,这个频率就是谐振频率.串联谐振电路有如下特点: 谐振时整个电路阻抗呈电阻性,阻抗最小,电流达到最大: 谐振时电感和电容两端的电压达到最大. 上图 ...

  10. vue2中安装vuex

    2022年2月7日,vue3成为默认版本,npm i vue安装的直接就是vue3了 npm i -vuex 安装的是vuex4 vuex4只能在vue3中使用 vue2中,要用vuex3版本,安装 ...