结论://go:embed(Go 1.16+)在编译期把静态文件打进二进制——变量声明为 string/[]byte(单文件)或 embed.FS(文件系统树,支持目录和通配符),部署时无需随二进制分发资源文件,解决"单文件交付"问题。
展开:三种形态:
import "embed"
//go:embed version.txt
var version string
//go:embed static/index.html
var indexHTML []byte
//go:embed static templates/*.tmpl
var assets embed.FS
embed.FS 实现 fs.FS 接口,可与 http.FS、template.ParseFS、fs.Sub 无缝组合——Web 服务内嵌静态资源、内嵌 SQL 迁移脚本是两大主流用法。规则细节:路径相对源文件目录、必须是存在的文件、./_ 开头的文件默认被目录匹配排除(可用 all: 前缀包含);嵌入目录时空目录被忽略。易错点:1)嵌入发生在编译期,改资源必须重新编译,热更场景不适用;2)embed.FS 是只读的;3)大资源显著增大二进制体积,注意构建缓存。与安全注意:嵌入的配置含密钥等于把密钥放进二进制,任何人可提取。
追问方向:与旧方案(go-bindata、packr)的差异、io/fs 抽象如何让同一套代码切换内嵌与磁盘文件。