embed 嵌入文件

概述 #

Go 编译后是一个 二进制可执行文件,部署非常简单。 在 1.16 版本之后, Go 提供了 embed 包支持编译时嵌入静态文件, 这样就可以直接在程序中访问静态文件的内容了。 结合这两个特性,可以将应用整体打包进一个二进制可执行文件。

常见应用场景 #

  • 将音频、视频文件嵌入小工具内,比如笔者曾经做过一个后台下载小工具,在下载成功/失败时会有对应的提示语音
  • 网站的静态资源,比如网站只有少量的静态资源 (icon, 图片,图表等) 文件,可以将这些文件打包进可执行文件
  • 应用配置文件直接打包进可执行文件
  • 自定义的静态文件服务

例子 #

测试文件 #

  • 新建两个文件并写入一些字符串用作演示
  • 新建一个 server.log 文件,写入如下内容
[Server]
[Server]
[Server]
  • 新建一个 client.log 文件,写入如下内容
[Client]
[Client]
[Client]

单个文件的内容嵌入到字符串 #

注意 embed 注解的写法。

package main

import (
	_ "embed"
	"fmt"
)

//go:embed server.log
var log string

func main() {
	fmt.Printf("%s\n", log)
}

// $ go run main.go
// 输出如下 
/**
  [Server]
  [Server]
  [Server]
*/

嵌入文件系统 FS #

FS: 表示只读的文件句柄集合

注意 embed 注解的写法。

嵌入单个文件 #

package main

import (
	"embed"
	"fmt"
)

//go:embed server.log
var license embed.FS

func main() {
	content, err := license.ReadFile("server.log")
	if err != nil {
		panic(err)
	} else {
		fmt.Printf("%s\n", content)
	}
}

// $ go run main.go
// 输出如下 
/**
  [Server]
  [Server]
  [Server]
*/

嵌入多个文件 #

注意 embed 注解的写法。

package main

import (
	"embed"
	"fmt"
)

//go:embed server.log client.log
var license embed.FS

func main() {
	content, err := license.ReadFile("server.log")
	if err != nil {
		panic(err)
	} else {
		fmt.Printf("%s\n", content)
	}

	content, err = license.ReadFile("client.log")
	if err != nil {
		panic(err)
	} else {
		fmt.Printf("%s\n", content)
	}
}

// $ go run main.go
// 输出如下 
/**
  [Server]
  [Server]
  [Server]
  [Client]
  [Client]
  [Client]
*/

小结 #

怎么样?embed 是不是功能强大,使用简单 :)

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。

© 蛮荆 | 陕公网安备 61011302001681 号 | 陕ICP备2023004378号-1 | Rendered by Hugo