这是官方自带的文件嵌入。先看代码
package main
import (
_ "embed"
)
//go:embed test.txt
var testString string // 当前目录,解析为string类型
//go:embed test.txt
var testByte []byte // 当前目录,解析为[]byte类型
//go:embed test/test.txt
var testAbsolutePath string // 子目录,解析为string类型
//go:embed notExistsFile
var testErr0 string // 文件不存在,编译报错:pattern notExistsFile: no matching files found
//go:embed dir
var testErr1 string // dir是目录,编译报错:pattern dir: cannot embed directory dir: contains no embeddable files
//go:embed ../test.txt
var testErr2 string // 相对路径,不是当前目录或子目录,编译报错:pattern ../test.txt: invalid pattern syntax
//go:embed D:\test.txt
var testErr3 string // 绝对路径,编译报错:pattern D:\test.txt: no matching files found
func main() {
println(testString)
println(string(testByte))
println(testAbsolutePath)
}
package main
import (
"embed"
"io"
"os"
)
//go:embed test0.txt test1.txt test1*.txt
//go:embed test/test0.txt test/test1.txt
//go:embed test0
var fileList embed.FS
/*
使用上述方法可以将多个文件或目录添加到fileList中。
1. 添加多个文件,且支持"*"号通配文件。
2. 支持子目录文件。
3. 支持嵌入一个目录。
*/
func main() {
testDir, err := fileList.ReadDir("test0")
if err != nil {
panic(err)
}
for _, v := range testDir {
println(v.Name()) // 打印嵌入的目录内容
}
// 使用fileList.Open可以生成一个对象,可以通过文件流那样读出来
testFile, err := fileList.Open("test0.txt")
if err != nil {
panic(err)
}
io.Copy(os.Stdout, testFile)
testFile, err = fileList.Open("test112.txt")
if err != nil {
panic(err)
}
io.Copy(os.Stdout, testFile)
testFile, err = fileList.Open("test/test1.txt")
if err != nil {
panic(err)
}
io.Copy(os.Stdout, testFile)
// 直接将文件内容读出来
data, err := fileList.ReadFile("test111.txt")
if err != nil {
panic(err)
}
println(string(data))
}
在项目中,需要将几十个音频文件放到一起,避免文件过多,且有初级的加密作用。
基于以上官方自带的功能,可以很方便的将这些资源文件嵌入到可执行文件中。
将此可执行文件作为一个中介,执行文件输出功能。例如: data.exe 内嵌文件名 导出文件名。
在以下代码中,加入了简单的密码授权。
我测试过嵌入音频和视频,视频单个文件超过750MB,总计33个文件1.5GB左右。生成可执行文件并运行没有问题。
试过第三方库,嵌入文件太大了不行。
package main
import (
"embed"
"io/ioutil"
"os"
"fmt"
)
const USEPASS="192939495969798999"
//go:embed res/*.smp
//go:embed res/*.mp4
var EmbedFileList embed.FS
func main() {
if len(os.Args)==4 {
password :=os.Args[1] // 功能调用的密码
inFile := os.Args[2] // 内嵌文件及路径
outFile:=os.Args[3] // 输出文件及路径
if password==USEPASS {
fmt.Println("wait...")
data, err := EmbedFileList.ReadFile(inFile)
if err != nil {
panic(err)
} else {
ioutil.WriteFile(outFile, data, 0644)
}
}
}
}