golang官方嵌入文件到可执行程序
前言
在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测试文件就知道是如何使用的,都不需要到处搜教程。
所以说学习要知其然且知其所以然,不然天天搜别人的示例代码,却不知道原理,是不能灵活使用的。
golang官方嵌入文件到可执行程序的更多相关文章
- Golang官方log包详解
Golang官方log包详解 以下全是代码, 详解在注释中, 请从头到尾看 // Copyright 2009 The Go Authors. All rights reserved. // Use ...
- freemarker嵌入文件输出结果
freemarker嵌入文件输出结果 1.嵌入的文件代码 inc.ftl: <#assign username="李思思"> 2.父文件代码 inner.ftl: &l ...
- iOS 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
时间2013-08-20 12:49:20 GoWhich原文 http://www.gowhich.com/blog/view/id/343 苹果官方 Crash文件分析方法 (iOS系统Cras ...
- golang 导出CSV文件中文乱码的问题
golang 导出CSV文件中文乱码的问题 解决办法: 在csv文件的开头写入 UTF-8 BOM // 创建文件 dstf, err := os.Create("./data/" ...
- 如何利用官方SDK文件来辅助开发
如何利用官方SDK文件来辅助开发 1.首先要先知道什么是SDK? SDK或者SDK包指的是,半导体厂商针对自己研发的芯片,同步推出的一个软件开发工具包. 它可以简单的为某个程序设计语言提供应用程序接口 ...
- Golang官方图片库
Golang 的图片出来通过提供操作每一个像素点设置颜色(http://www.cnblogs.com/ghj1976/p/3441536.html) 和 提供通过可选蒙版图片重叠操作 (http:/ ...
- golang调用c++文件
简要步骤: 1,将c++ 的方法提取到头文件.h中( ) 2,编译cc(c++)文件为动态链接库so文件 3,将头文件放入include目录 .so放入lib目录 4,go程序中指定 CFLAGS 和 ...
- golang 远程传输文件
概述 之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang 执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件, ...
- 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
对于提交的苹果官方的app,在审核的时候会给我们一些crash文件,对于这些有用的文件,里面是关于我们的bug的一些信息,那么该如何去调试呢 第一步:在任意目录创建一个目录,用来调试crash,我这里 ...
随机推荐
- redis防止重复提交
public interface DistributedLock { boolean getLock(String var1, String var2, int var3);//加锁 void unL ...
- 21.iptables
1.策略与规则链 iptables 服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下: 在进行路由选择前处理数据包(PRE ...
- SQL(replace)替换字段中指定的字符
语法:update 表名 set 字段名=REPLACE(字段名,'修改前的字符','修改后的字符') 例 Product商品表中Name 名字字段中描述中将'AAA' 修改成 'BBB' SQL语句 ...
- CodeForces - 948C (前缀和+二分)
博客界面的小人搞不好导致无心写博客 题意:tyd非常喜欢玩雪,下雪下了n天,第i天她会堆一堆大小为Vi的雪堆,但因为天气原因,每堆雪会融化Ti,问每天总共融化了多少雪: 直接上代码+注释 1 #inc ...
- Codeforces Round #668 (Div. 2) B. Array Cancellation (思维,贪心)
题意:有一个长度为\(n\)并且所有元素和为\(0\)的序列,你可以使\(a_{i}-1\)并且\(a_{j}+1\),如果\(i<j\),那么这步操作就是免费的,否则需要花费一次操作,问最少操 ...
- 最小生成树 Prim和Kruskal
感觉挺简单的,Prim和Dijkstra差不多,Kruskal搞个并查集就行了,直接上代码吧,核心思路都是找最小的边. Prim int n,m; int g[N][N]; int u,v; int ...
- 生成不带签名(BOM)的UTF8格式的XML
生成XML的一种方法如下: using System.Xml; private void SaveXML(string savePath) { XmlWriterSettings setting = ...
- Leetcode(35)-搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 这个题目很简单,因为它是给定的排序数组而且没有重 ...
- html图片占位符插件holder.js
1.下载源码 下载链接:http://www.bootcdn.cn/holder/ 2.在HTML中引入holde.js <script src="holder-js-2.9.4\ho ...
- 杭电多校HDU 6599 I Love Palindrome String (回文树)题解
题意: 定义一个串为\(super\)回文串为: \(\bullet\) 串s为主串str的一个子串,即\(s = str_lstr_{l + 1} \cdots str_r\) \(\bullet\ ...