经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
golang官方嵌入文件到可执行程序
来源:cnblogs  作者:janbar  时间:2021/2/18 18:58:34  对本文有异议

前言

在go官方出嵌入文件的方法前我在网上找过,并且自己还研究过,虽然没有问题,但是既然官方支持还是用起来吧。
看了下go源码embed/embed.go很简单,并且看embed/internal/embedtest/embed_test.go就知道如何使用。

示例程序

嵌入文件直接访问

原理是使用go:embed标签来完成。下面是直接读取文件内容,需要注意下面几点。
文件不是utf8编码时,输出内容为中文会乱码。
测试过嵌入文件只能为源码文件同级目录和子目录下的文件,试过其他目录的绝对路径或相对路径会报错。
我测试过几个能想到的场景,有些会报错,所以在使用时需要注意。

  1. package main
  2. import (
  3. _ "embed"
  4. )
  5. //go:embed test.txt
  6. var testString string // 当前目录,解析为string类型
  7. //go:embed test.txt
  8. var testByte []byte // 当前目录,解析为[]byte类型
  9. //go:embed test/test.txt
  10. var testAbsolutePath string // 子目录,解析为string类型
  11. //go:embed notExistsFile
  12. var testErr0 string // 文件不存在,编译报错:pattern notExistsFile: no matching files found
  13. //go:embed dir
  14. var testErr1 string // dir是目录,编译报错:pattern dir: cannot embed directory dir: contains no embeddable files
  15. //go:embed ../test.txt
  16. var testErr2 string // 相对路径,不是当前目录或子目录,编译报错:pattern ../test.txt: invalid pattern syntax
  17. //go:embed D:\test.txt
  18. var testErr3 string // 绝对路径,编译报错:pattern D:\test.txt: no matching files found
  19. func main() {
  20. println(testString)
  21. println(string(testByte))
  22. println(testAbsolutePath)
  23. }

嵌入文件列表

  1. package main
  2. import (
  3. "embed"
  4. "io"
  5. "os"
  6. )
  7. //go:embed test0.txt test1.txt test1*.txt
  8. //go:embed test/test0.txt test/test1.txt
  9. //go:embed test0
  10. var fileList embed.FS
  11. /*
  12. 使用上述方法可以将多个文件或目录添加到fileList中。
  13. 1. 添加多个文件,且支持"*"号通配文件。
  14. 2. 支持子目录文件。
  15. 3. 支持嵌入一个目录。
  16. */
  17. func main() {
  18. testDir, err := fileList.ReadDir("test0")
  19. if err != nil {
  20. panic(err)
  21. }
  22. for _, v := range testDir {
  23. println(v.Name()) // 打印嵌入的目录内容
  24. }
  25. // 使用fileList.Open可以生成一个对象,可以通过文件流那样读出来
  26. testFile, err := fileList.Open("test0.txt")
  27. if err != nil {
  28. panic(err)
  29. }
  30. io.Copy(os.Stdout, testFile)
  31. testFile, err = fileList.Open("test112.txt")
  32. if err != nil {
  33. panic(err)
  34. }
  35. io.Copy(os.Stdout, testFile)
  36. testFile, err = fileList.Open("test/test1.txt")
  37. if err != nil {
  38. panic(err)
  39. }
  40. io.Copy(os.Stdout, testFile)
  41. // 直接将文件内容读出来
  42. data, err := fileList.ReadFile("test111.txt")
  43. if err != nil {
  44. panic(err)
  45. }
  46. println(string(data))
  47. }

总结

今天看到go1.16发布,看了下特性,支持嵌入文件到可执行程序中,所以研究了一下。
我发现直接看源码的_test测试文件就知道是如何使用的,都不需要到处搜教程。
所以说学习要知其然且知其所以然,不然天天搜别人的示例代码,却不知道原理,是不能灵活使用的。

原文链接:http://www.cnblogs.com/janbar/p/14412784.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号