Golang笔记:使用embed包将静态资源嵌入到程序中

目的

Golang编译程序默认是静态编译,会把相关的库都打包到一起,这在分发部署使用时非常方便。不过如果项目中用到的外部的静态资源文件,通常就需要将这些资源和程序一起拷贝分发了。现在可以使用标准库中 embedhttps://pkg.go.dev/embed 将静态资源文件打包到一起。

使用演示

embed 包支持将文件变成 string []byte 或者 FS 类型的变量引入程序中。下面是一些演示:

package main

import (
	_ "embed"
	"fmt"
)

// 下面一行像是注释的的内容是一条指令
// 它会将后面指定的文件的内容赋值给下面紧挨着声明的变量

//go:embed file1.txt
var s string

//go:embed subdir/file2.txt
var b []byte

func main() {
	fmt.Println(s)
	fmt.Println(string(b))
}

在这里插入图片描述

下面是 FS 类型演示:

package main

import (
	"embed"
	_ "embed"
	"fmt"
)

// 下面是embed最好用的功能,把文件放到FS中

//go:embed file1.txt
//go:embed subdir/file2.txt
var f embed.FS

func main() {
	data, _ := f.ReadFile("file1.txt")
	fmt.Println(string(data))
	data, _ = f.ReadFile("subdir/file2.txt")
	fmt.Println(string(data))
}

在这里插入图片描述

//go:embed 指令

//go:embed 指令有一些需要注意的点(以下内容根据版本不同可能会有较大变动):

  • 要嵌入的文件支持当前程序( *.go )所在目录及子目录;
  • 嵌入的文件系统是只读的,支持 Open ReadDir ReadFile 三个方法进行访问;
  • 一条 //go:embed 指令后面可以写用空格隔开的多个文件,也可以用多条 //go:embed 将文件内容放入一个变量中,比如下面两者是等价的:
    //go:embed file1.txt file2.txt
    var f embed.FS
    
    //go:embed file1.txt
    //go:embed file2.txt
    var f embed.FS
    
  • //go:embed 后也可以跟文件夹,默认情况下不会包含文件夹中 . _ 开头的文件;
  • 可以使用 * 来匹配文件下所有文件(包括 . _ 开头的文件),但 * 不会递归子目录中 . _ 开头的文件;
  • 可以在文件夹名称前加上 all: 来匹配所有文件,并且会递归子目录中 . _ 开头的文件;
  • 可以使用 //go:embed * 来表示当前目录;

在WebServer中应用

embed比较常用的一个应用是在WebServer项目中打包网页静态资源文件,比如下面例子:

目录结构和网页文件内容:
在这里插入图片描述

WebServer代码:

package main

import (
	"embed"
	_ "embed"
	"net/http"
)

//go:embed index.html assets
var content embed.FS

func main() {
	// 使用embed.FS作为WebServer静态文件服务目录
	fs := http.FileServer(http.FS(content))
	http.Handle("/", http.StripPrefix("/", fs))
	http.ListenAndServe(":80", nil)
}

在这里插入图片描述

总结

embed 是一个非常好的工具,可以大大提升编译出的程序的封装性,方便安装部署。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在将Vue的打文件(dist目录中的静态资源)整合进Golang的可执行文件中,可以使用go-bindata等工具来实现。 首先,需要将dist目录中的静态资源文件(如js、css、图片等)转化为Go代码。可以使用go-bindata这个go工具来实现,这个工具会将静态文件编译为Go代码,可以在程序中直接访问到。具体操作步骤如下: 1. 安装go-bindata工具: ```shell go get -u github.com/go-bindata/go-bindata/... ``` 2. 在项目根目录创建一个文件夹(如assets),用于存放生成的绑定数据文件。 3. 在终端中进入到dist目录下,执行以下命令将dist目录下的所有文件转化为Go代码,并输出到assets文件夹中: ```shell go-bindata -o ../assets/assets.go -pkg assets ./... ``` 4. 在Go代码中引入生成的assets.go文件,即可在代码中访问到dist目录中的静态资源文件。在代码中使用`assets.Asset(filename string)`方法来获取静态资源文件的内容。 接下来,需要将Vue打文件整合进Golang的可执行文件,可以使用Go的embed来实现,这个在Go 1.16版本中新增。embed可以将静态资源文件嵌入到可执行文件中,无需再依赖外部文件。具体操作步骤如下: 1. 在Go代码中引入embed: ```go import "embed" ``` 2. 使用embed的`//go:embed`指令将dist目录中的静态资源文件嵌入到可执行文件中。例如: ```go //go:embed dist/* var staticFiles embed.FS ``` 3. 在代码中可以通过`staticFiles`来访问嵌入静态资源文件。 最后,将Golang代码编译为可执行文件时,dist目录中的静态资源文件会自动嵌入到可执行文件中。可以通过`go build`命令来编译项目: ```shell go build -o myapp main.go ``` 编译成功后,会生成可执行文件myapp,该文件中已经含了dist目录中的静态资源文件,可以直接运行该文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值