Golang embed教程:如何嵌入包含图片的文件夹?
Go embed 嵌入文件夹后按文件名调用的实现方法
1. 先嵌入整个文件夹
使用//go:embed指令嵌入目标文件夹的所有内容,变量类型声明为embed.FS——它实现了标准库的fs.FS接口,后续可直接用这个变量操作嵌入的文件。
示例代码:
package main import ( "embed" ) // 嵌入static文件夹下所有内容(包含子目录及层级文件) // 路径为当前Go源文件的相对路径 //go:embed static/** var resources embed.FS
- 若仅需嵌入文件夹下的直接文件(不含子目录),可写成
//go:embed static/* - 若要嵌入整个文件夹(含所有子目录和文件),用
//go:embed static/**
2. 按文件名调用嵌入的文件
嵌入后,可通过embed.FS提供的方法(如Open、ReadFile)直接指定文件名调用,也能传给接受fs.FS参数的标准库函数(比如你用到的template.ParseFS)。
直接读取单个文件
import "log" // 读取static/img/logo.png文件 content, err := resources.ReadFile("static/img/logo.png") if err != nil { log.Fatal(err) // 处理文件不存在等错误 } // 直接使用content字节数组
结合template.ParseFS使用
针对你给出的示例,注意template.ParseFS的第二个参数是可变glob模式参数,无需逗号分隔,直接传入多个匹配模式即可:
import "html/template" // 解析static目录下所有png和jpg文件 tpl, err := template.ParseFS(resources, "static/*.png", "static/*.jpg") if err != nil { log.Fatal(err) } // 若需匹配所有子目录下的png/jpg文件 tpl, err := template.ParseFS(resources, "static/**/*.png", "static/**/*.jpg")
关键注意点
- 调用时的文件路径必须和嵌入时的路径对应,比如嵌入的是
static/**,调用时就要写static/xxx/yyy.png,不能省略前缀static/ //go:embed指令必须紧挨着声明的embed.FS变量,中间不能有空行- 嵌入的路径必须是相对路径,不能用绝对路径
内容的提问来源于stack exchange,提问作者Skaz
相关产品推荐
相关产品推荐

