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. 2022 Gartner RPA魔力象限,弘玑Cyclone位置飞跃国产RPA进击全球

    文/王吉伟 7月25日,国际权威分析机构Gartner发布了2022全球RPA魔力象限报告(Gartner RPA MQ),UiPath.Automation Anywhere.微软等来自全球的15家 ...

  2. 【数据结构】C语言实现动态扩容数组

    // resizable array /* Think about a set of functions that provide a mechanism of resizable array of ...

  3. C# 中的for/foreach循环

    for 循环是一个执行特定次数的循环的重复控制结构. C# 中 for 循环的语法: for ( init; condition; increment ) { statement(s); } 执行流程 ...

  4. C++ 调用 Python 总结(一)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  5. 菜鸟角度简单分析BP算法(Error Back Propagation)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  6. js实现展开多级数组

    1.递归 function steamrollArray(arr) { let res = [] for (const a of arr) { if(a instanceof Array){ res ...

  7. python面向对象(绑定方法与非绑定方法)

    # 一.绑定方法:特殊之处在于将调用者本身当做第一个参数自动传入 # 1)绑定给对象的方法:调用者是对象,自动传入的是对象 # 2)绑定给类的方法:调用者是类,自动传入的是类 # 类方法的应用 # 需 ...

  8. NA嵌入Flutter页面

    目录介绍 01.Android承载flutter容器 02.过时的NA跳转flutter方案 03.升级版本NA跳转Flutter处理 04.如何处理NA跳转flutter传参 05.思考遇到的几个问 ...

  9. 05.java多线程问题

    目录介绍 5.0.0.1 线程池具有什么优点和缺点?为什么说开启大量的线程,会降低程序的性能,那么该如何做才能降低性能? 5.0.0.3 线程中start和run方法有什么区别?wait和sleep方 ...

  10. Linux快速入门(一)Linux基础知识

    我的环境:Ubuntu(后面涉及到的Linux均为Debian系列) Linux不同发行版的包管理方式 (1)Redhat系列:Redhat系列的包管理方式采用的是基于RPM包的YUM包管理方式 (2 ...