Go打包静态文件的两种方式

 更新时间:2024年04月22日 08:39:37   作者:beyondyou  
使用 Go 开发应用的时候,有时会遇到需要读取静态资源的情况,如果不打包处理这种静态文件:发布单独挂载这种静态文件相对比较麻烦,就有人会想办法把静态资源文件打包进 Go 的程序文件中,下面介绍两种打包方式:go-bindata、go:embed,需要的朋友可以参考下

一、前言

使用 Go 开发应用的时候,有时会遇到需要读取静态资源的情况。

  • 比如:开发 Web 应用,程序需要加载模板文件生成输出的 HTML。在程序部署的时候,除了发布应用可执行文件外,还需要发布依赖的静态资源文件。这给发布过程添加了一些麻烦。

  • 比如:项目中有一些静态模板需要渲染,然而这些模板又是固定的静态文件

如果不打包处理这种静态文件:发布单独挂载这种静态文件相对比较麻烦,就有人会想办法把静态资源文件打包进 Go 的程序文件中。

下面介绍两种打包方式:go-bindata、go:embed

二、go-bindata打包静态资源

go-bindata 将任何文件封装在一个 Go 语言的 Source Code 里面,文件数据在转换为原始字节时可以选择使用 gzip 压缩,同时提供了统一的接口,帮助获取原始的文件数据

2.1 安装

go get -u github.com/go-bindata/go-bindata/...

安装打包工具 go-bindata 到GOPATH/bin中,输入下面的命令检查下是否安装成功:

go-bindata  --version

2.2 打包

go-bindata -o=resource.go -pkg=resource   ./resource/...
  • 将把./resource目录下的所有文件转换为Go代码,注意后面的... 代表讲该文件下面所有的文件及子文件打包
  • 生成一个名为resource.go的文件,你可以在你的Go代码中通过main包来访问这些静态文件。

如果你查看源文件,可以查看 _bindata 中维护了文件的信息

2.3 使用

  • Asset(name string) ([]byte, error) :根据资源名称返回文件内容
  • MustAsset(name string) []byte :根据资源名称返回文件内容
  • AssetInfo(name string) (os.FileInfo, error) : 根据资源名称返回文件信息
  • AssetNames() []string :返回所有的资源名称
  • AssetDir(name string) ([]string, error) : 返回某一个文件夹一层的名称
  • RestoreAsset(dir, name string) error
  • RestoreAssets(dir, name string) error

三、go:embed 打包静态资源

Go 1.16版本开始,可以使用go:embed来嵌入文件。

embed是在Go 1.16中新加包。它通过//go:embed指令,可以在编译阶段将静态资源文件打包进编译好的程序(exe)中,并提供访问这些文件的能力。

  • 对于单个的文件,支持嵌入类型为stringbyte slice
  • 对于多个文件和文件夹,支持嵌入为新的文件系统FS
  • 比如导入"embed"包,即使无显式的使用
  • go:embed指令用来嵌入,必须紧跟着嵌入后的变量名

注意:go embed的使用只能用于包级别声明的变量(全局变量)

3.1 embed 要嵌入的文件

//go:embed 要嵌入的文件
  • 示例一
import (
    _ "embed"
    "fmt"
)
​
//go:embed repos.tmpl
var data string
​
func main() {
    fmt.Println(data)
}
  • 示例二
import (
    _ "embed"
    "fmt"
)
​
//go:embed repos.tmpl
var data []byte
​
func main() {
    fmt.Println(string(data))
}

3.2 嵌入文件系统FS

对于多个文件和文件夹,支持嵌入为新的文件系统FS

embed.FS提供了三个方法进行访问:

Open(name string) (fs.File, error)   根据资源key返回文件
​
ReadFile(name string) ([]byte, error)  根据资源key返回文件内容
​
ReadDir(name string) ([]fs.DirEntry, error)  根据key读取文件夹   
  • 嵌入文件夹

使用embed.FS嵌入的文件变量,具有3种功能,如下所示:

import (
    "embed"
    _ "embed"
    "fmt"
)
​
//go:embed resource
var data embed.FS
​
func main() {
    // 直接读取文件
    file, err := data.ReadFile("resource/cmd/main.go.tmpl")
    fmt.Println(string(file), err)
}
  • 嵌入多个文件
import (
    "embed"
    _ "embed"
    "fmt"
)
​
//go:embed aa.text bb.text
var data embed.FS
​
func main() {
    file, err := data.ReadFile("aa.text")
    fmt.Println(string(file), err)
}

到此这篇关于Go打包静态文件的两种方式的文章就介绍到这了,更多相关Go打包静态文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言实现并发控制的常见方式详解

    Go语言实现并发控制的常见方式详解

    这篇文章主要为大家详细介绍了Go语言实现并发控制的几种常见方式,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-03-03
  • jenkins配置golang 代码工程自动发布的实现方法

    jenkins配置golang 代码工程自动发布的实现方法

    这篇文章主要介绍了jenkins配置golang 代码工程自动发布,jks是个很好的工具,使用方法也很多,我只用了它简单的功能,对jenkins配置golang相关知识感兴趣的朋友一起看看吧
    2022-07-07
  • 使用Lumberjack+zap进行日志切割归档操作

    使用Lumberjack+zap进行日志切割归档操作

    这篇文章主要介绍了使用Lumberjack+zap进行日志切割归档操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • go语言实现简易比特币系统钱包的原理解析

    go语言实现简易比特币系统钱包的原理解析

    这篇文章主要介绍了go语言实现简易比特币系统钱包的原理解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Go计算某段代码运行所耗时间简单实例

    Go计算某段代码运行所耗时间简单实例

    这篇文章主要给大家介绍了关于Go计算某段代码运行所耗时间的相关资料,主要介绍了Golang记录计算函数执行耗时、运行时间的一个简单方法,文中给出了详细的代码示例,需要的朋友可以参考下
    2023-11-11
  • 使用Gomock进行单元测试的方法示例

    使用Gomock进行单元测试的方法示例

    这篇文章主要介绍了使用Gomock进行单元测试的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • golang中两个协程交替打印数字和字母的实现

    golang中两个协程交替打印数字和字母的实现

    这篇文章给大家介绍了golang中两个协程交替打印数字和字母的实现,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • golang 防缓存击穿singleflight的实现

    golang 防缓存击穿singleflight的实现

    本文主要介绍了golang 防缓存击穿singleflight的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Golang pipe在不同场景下远程交互

    Golang pipe在不同场景下远程交互

    这篇文章主要介绍了Golang pipe在不同场景下远程交互,pipe实现从一个进程重定向至另一个进程,它是双向数据通道,用于实现进行间通信
    2023-03-03
  • Golang交叉编译(跨平台编译)的使用

    Golang交叉编译(跨平台编译)的使用

    本文主要介绍了Golang交叉编译(跨平台编译)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论