首页 > 其他分享 >脑洞golang embed 的使用场景

脑洞golang embed 的使用场景

时间:2024-04-12 10:11:52浏览次数:30  
标签:可执行文件 git 脑洞 golang 编译 Go 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: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

标签:可执行文件,git,脑洞,golang,编译,Go,embed
From: https://www.cnblogs.com/yjf512/p/18130596

相关文章

  • golang JSON序列化和反序列化
    目录JSON序列化(Marshaling)JSON反序列化(Unmarshaling)错误处理和注意事项在Go语言(通常被称为Golang)中,JSON(JavaScriptObjectNotation)是一种常用的数据交换格式。Go标准库提供了encoding/json包,使得JSON的序列化(将Go数据结构转换为JSON格式的字符串)和反序列化(将JSON格式的字符串......
  • Golang 中 在gmp下,mutex 是如何并发的
    在Go语言的并发模型中,GMP(Goroutine、Machine、Processor)模型是核心概念,其中Mutex(互斥锁)扮演着关键的角色,用于同步并发访问共享资源,防止数据竞争和不一致性问题。以下是Mutex在GMP模型下实现并发的详细解释:Goroutines(协程)轻量级的线程:Goroutines是Go语言中的轻量级线程,它......
  • golang实现R6900路由器外网IP更新通知程序
    程序一分钟执行一次,检测路由器外网IP地址变更则自动发送邮件,使用网易126smtp协议发送邮件,邮箱地址及授权码请自行替换,getIp函数中的grep根据自己的网卡信息调试替换R6900路由器的交叉编译语句:CGO_ENABLED=0GOOS=linuxGOARCH=armGOARM=5gobuildxxxx.go1234567......
  • embedding models 是什么
    embeddingmodels是一类机器学习模型,它们的核心功能是将高维、离散的输入数据(如词汇、类别标签、节点或实体)映射到低维、连续的向量空间中。这些向量(即embeddings)通常具有丰富的语义信息,并能够捕捉原始数据之间的潜在关系和相似度。以下是对embeddingmodels的详细说明: 1.......
  • 基于Golang的Nano游戏服务器框架
    在游戏开发过程中,一个高效的服务器框架是至关重要的。Nano正是这样一个框架,它以Golang为基础,提供了轻量级、高性能的服务器解决方案。下面,我们将深入探讨Nano的设计理念、核心特性以及如何在实战中使用它。Nano框架概述Nano是一个针对游戏服务器的框架,能够帮助开发者快速......
  • golang中结构体初始化的语法格式
    在Go语言中,结构体(struct)的初始化可以通过以下几种方式来进行:键值对初始化(字段名明确指定):当结构体字段很多或者你需要只初始化部分字段时,可以采用键值对的方式来初始化结构体。每个字段名后面跟一个冒号和它的值。typePersonstruct{NamestringAgeintC......
  • 【go】golang中的通道
    通道:channel名词:在goroutine中通信的管道注意:任何时候,同一时刻只能有一个goroutine访问通道进行发送和获取数据通道的顺序:遵循先入先出的规则通道的定义//定义一个通道var变量名chan数据类型//比如:varintChchanint64varstrChchanstringvarmapChchanm......
  • 深度学习-卷积神经网络--什么是manifold embedding--66
    目录参考:流形假设(ManifoldHypothesis)在介绍流形学习(Manifoldlearning)之前,首先需要理解一个假设,就是流形假设(ManifoldHypothesis)。这个假设认为,高维数据很多都是低维流形嵌入(embedding)于高维空间当中,比如说三维空间里的各种平面或者曲面,虽然这些平面或者曲面处于三......
  • 【论文笔记-1】Multi-lingual Knowledge Graph Embeddings for Cross-lingual Knowled
    论文结构摘要:为了实现跨语言的知识对齐,提出了MTransE,一个基于翻译的多语言知识图谱嵌入模型。通过在分离的嵌入空间中编码每种语言的实体和关系,MTransE为每个嵌入向量提供了过渡到其他空间中跨语言对应物的功能,同时保留了单语种嵌入的功能。动机(待解决的问题):嵌入能够帮助提......
  • Golang context (上下文)是什么
    Golangcontext(上下文)是什么?原创 几颗酥 几颗酥 2024-03-1111:24 广西 1人听过介绍Context 是golang中十分重要的接口,用于定义 goroutine 中的上下文信息,context 常用于以下几种情况:数据传递:在多个 goroutine 中传递数据超时管理:通过配置超时时间,可以......