356 words
2 minutes
Golang embed 程序嵌入文件
2024-11-01

概述#

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

常见应用场景#

  • 将音频、视频文件嵌入小工具内
  • 网站的静态资源,比如网站只有少量的静态资源 (icon, 图片,图表等) 文件,可以将这些文件打包进可执行文件
  • 应用配置文件直接打包进可执行文件
  • 自定义的静态文件服务

测试案例#

生成两个文件 server.logclient.log

单文件嵌入#

注意 //go:embed server.log 没有空格来分割单词和//

package main

import (
	_ "embed"
	"fmt"
)

//go:embed server.log
var log string

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

嵌入文件系统 FS#

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

注意 embed 注解的写法。

嵌入单个文件#

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)
	}
}

嵌入多个文件#

注意 embed 注解的写法。

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)
	}
}
Golang embed 程序嵌入文件
https://fuwari.vercel.app/posts/golang/embed/
Author
wavepig
Published at
2024-11-01