前言
在go官方出嵌入文件的方法前我在网上找过,并且自己还研究过,虽然没有问题,但是既然官方支持还是用起来吧。
看了下go源码embed/embed.go
很简单,并且看embed/internal/embedtest/embed_test.go
就知道如何使用。
示例程序
嵌入文件直接访问
原理是使用go:embed
标签来完成。下面是直接读取文件内容,需要注意下面几点。
文件不是utf8
编码时,输出内容为中文会乱码。
测试过嵌入文件只能为源码文件同级目录和子目录下的文件,试过其他目录的绝对路径或相对路径会报错。
我测试过几个能想到的场景,有些会报错,所以在使用时需要注意。
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)) }
总结
今天看到go1.16发布,看了下特性,支持嵌入文件到可执行程序中,所以研究了一下。
我发现直接看源码的_test测试文件就知道是如何使用的,都不需要到处搜教程。
所以说学习要知其然且知其所以然,不然天天搜别人的示例代码,却不知道原理,是不能灵活使用的。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月16日
2024年11月16日
- 齐豫.2003-THE.UNHEARD.OF.CHYI.3CD【苏活音乐】【WAV+CUE】
- 黄乙玲1986-讲什么山盟海誓[日本东芝版][WAV+CUE]
- 曾庆瑜1991-柔情陷阱[台湾派森东芝版][WAV+CUE]
- 陈建江《享受男声》DTS-ES6.1【WAV】
- 群星《闪光的夏天 第5期》[FLAC/分轨][392.38MB]
- 徐小凤《三洋母带》1:1母盘直刻[WAV+CUE][981M]
- 王菲1995《菲靡靡之音》[香港首版][WAV+CUE][1G]
- 《双城之战》主题小游戏现已上线 扮演金克丝探索秘密基地
- 《霍格沃茨之遗》PS5Pro画面对比:光追性能显著提升
- 《怪猎荒野》PS5Pro主机版对比:B测性能都不稳定
- 黄宝欣.1992-黄宝欣金装精选2CD【HOMERUN】【WAV+CUE】
- 群星.1996-宝丽金流行爆弹精丫宝丽金】【WAV+CUE】
- 杜德伟.2005-独领风骚新歌精选辑3CD【滚石】【WAV+CUE】
- 安与骑兵《心无疆界》[低速原抓WAV+CUE]
- 柏菲唱片-群星〈胭花四乐〉2CD[原抓WAV+CUE]