Go 1.16+ 的 embed 包支持编译时嵌入文件,需用变量声明 + //go:embed 指令绑定路径,路径须静态、存在且非符号链接;读取必须用 FS.Open,路径需严格匹配嵌入根目录。
Go 1.16+ 的 embed 包能直接将文件编译进二进制,无需外部依赖或运行时加载——但必须满足路径静态可判定、文件在构建时存在、且不能是 symlink 或动态生成内容,否则构建失败。
embed.FS 必须用变量声明,不能在函数内直接调用
embed.FS 是一个类型,不是函数;你不能写 embed.FS{"./static"} 或在 http.FileServer 里临时构造。它必须通过变量声明 + //go:embed 指令绑定:
import "embed"//go:embed static/* var staticFiles embed.FS
func main() { http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(staticFiles)))) }
常见错误:把 //go:embed 放在函数内部、或放在未导出变量上(如 files 小写),会导致构建时静默忽略嵌入,运行时报 fs: file does not exist。
路径匹配规则严格,通配符不支持递归子目录
//go:embed 的 glob 模式只支持 *(单层)和 **(Go 1.22+ 才支持递归)。例如: