golang官方嵌入文件到可执行程序的示例详解
前言
在go官方出嵌入文件的方法前我在网上找过,并且自己还研究过,虽然没有问题,但是既然官方支持还是用起来吧。
看了下go源码embed/embed.go很简单,并且看embed/internal/embedtest/embed_test.go就知道如何使用。
示例程序
嵌入文件直接访问
原理是使用go:embed标签来完成。下面是直接读取文件内容,需要注意下面几点。
文件不是utf8编码时,输出内容为中文会乱码。
测试过嵌入文件只能为源码文件同级目录和子目录下的文件,试过其他目录的绝对路径或相对路径会报错。
我测试过几个能想到的场景,有些会报错,所以在使用时需要注意。
packagemain
import(
_"embed"
)
//go:embedtest.txt
vartestStringstring//当前目录,解析为string类型
//go:embedtest.txt
vartestByte[]byte//当前目录,解析为[]byte类型
//go:embedtest/test.txt
vartestAbsolutePathstring//子目录,解析为string类型
//go:embednotExistsFile
vartestErr0string//文件不存在,编译报错:patternnotExistsFile:nomatchingfilesfound
//go:embeddir
vartestErr1string//dir是目录,编译报错:patterndir:cannotembeddirectorydir:containsnoembeddablefiles
//go:embed../test.txt
vartestErr2string//相对路径,不是当前目录或子目录,编译报错:pattern../test.txt:invalidpatternsyntax
//go:embedD:\test.txt
vartestErr3string//绝对路径,编译报错:patternD:\test.txt:nomatchingfilesfound
funcmain(){
println(testString)
println(string(testByte))
println(testAbsolutePath)
}
嵌入文件列表
packagemain
import(
"embed"
"io"
"os"
)
//go:embedtest0.txttest1.txttest1*.txt
//go:embedtest/test0.txttest/test1.txt
//go:embedtest0
varfileListembed.FS
/*
使用上述方法可以将多个文件或目录添加到fileList中。
1.添加多个文件,且支持"*"号通配文件。
2.支持子目录文件。
3.支持嵌入一个目录。
*/
funcmain(){
testDir,err:=fileList.ReadDir("test0")
iferr!=nil{
panic(err)
}
for_,v:=rangetestDir{
println(v.Name())//打印嵌入的目录内容
}
//使用fileList.Open可以生成一个对象,可以通过文件流那样读出来
testFile,err:=fileList.Open("test0.txt")
iferr!=nil{
panic(err)
}
io.Copy(os.Stdout,testFile)
testFile,err=fileList.Open("test112.txt")
iferr!=nil{
panic(err)
}
io.Copy(os.Stdout,testFile)
testFile,err=fileList.Open("test/test1.txt")
iferr!=nil{
panic(err)
}
io.Copy(os.Stdout,testFile)
//直接将文件内容读出来
data,err:=fileList.ReadFile("test111.txt")
iferr!=nil{
panic(err)
}
println(string(data))
}
总结
今天看到go1.16发布,看了下特性,支持嵌入文件到可执行程序中,所以研究了一下。
我发现直接看源码的_test测试文件就知道是如何使用的,都不需要到处搜教程。
所以说学习要知其然且知其所以然,不然天天搜别人的示例代码,却不知道原理,是不能灵活使用的。
到此这篇关于golang官方嵌入文件到可执行程序的文章就介绍到这了,更多相关golang嵌入文件到可执行程序内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。