前言

在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官方嵌入文件到可执行程序的更多相关文章

  1. Golang官方log包详解

    Golang官方log包详解 以下全是代码, 详解在注释中, 请从头到尾看 // Copyright 2009 The Go Authors. All rights reserved. // Use ...

  2. freemarker嵌入文件输出结果

    freemarker嵌入文件输出结果 1.嵌入的文件代码 inc.ftl: <#assign username="李思思"> 2.父文件代码 inner.ftl: &l ...

  3. iOS 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)

    时间2013-08-20 12:49:20 GoWhich原文  http://www.gowhich.com/blog/view/id/343 苹果官方 Crash文件分析方法 (iOS系统Cras ...

  4. golang 导出CSV文件中文乱码的问题

    golang  导出CSV文件中文乱码的问题 解决办法: 在csv文件的开头写入 UTF-8 BOM // 创建文件 dstf, err := os.Create("./data/" ...

  5. 如何利用官方SDK文件来辅助开发

    如何利用官方SDK文件来辅助开发 1.首先要先知道什么是SDK? SDK或者SDK包指的是,半导体厂商针对自己研发的芯片,同步推出的一个软件开发工具包. 它可以简单的为某个程序设计语言提供应用程序接口 ...

  6. Golang官方图片库

    Golang 的图片出来通过提供操作每一个像素点设置颜色(http://www.cnblogs.com/ghj1976/p/3441536.html) 和 提供通过可选蒙版图片重叠操作 (http:/ ...

  7. golang调用c++文件

    简要步骤: 1,将c++ 的方法提取到头文件.h中( ) 2,编译cc(c++)文件为动态链接库so文件 3,将头文件放入include目录 .so放入lib目录 4,go程序中指定 CFLAGS 和 ...

  8. golang 远程传输文件

    概述 之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang 执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件, ...

  9. 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)

    对于提交的苹果官方的app,在审核的时候会给我们一些crash文件,对于这些有用的文件,里面是关于我们的bug的一些信息,那么该如何去调试呢 第一步:在任意目录创建一个目录,用来调试crash,我这里 ...

随机推荐

  1. 压缩文件 .zip.001 .zip.002合并

    可以把名字特别长的命名为1  这样简单些 copy /B 1.zip.001+1.zip.002 1.zip

  2. checkAll操作

    //全部勾选 function checkAll(obj) { var cols = document.getElementsByName('cols'); for ( var i = 0; null ...

  3. 修改PowerShell的输入提示符

    如下图,"PS C:\Windows\System32\drivers\etc>" 就是PowerShell的输入提示符,默认是显示"PS"加上当前所在的 ...

  4. .NET 微服务

    前文传送门: 什么是云原生? 现代云原生设计理念 Microservices 微服务是构建现代应用程序的一种流行的体系结构样式,云原生系统拥抱微服务. 微服务是由一组(使用共享结构交互的.独立的小块服 ...

  5. hdu 6268 Master of Subgraph(点分治+bitset)

    You are given a tree with n nodes. The weight of the i-th node is wi. Given a positive integer m, no ...

  6. hdu4348 To the moon (主席树 || 离线线段树)

    Problem Description Background To The Moon is a independent game released in November 2011, it is a ...

  7. Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) C. Division (数学)

    题意:有两个数\(p\)和\(q\),找到一个最大的数\(x\),使得\(p\ mod\ x=0\)并且\(x\ mod\ q\ne 0\). 题解:首先,如果\(p\ mod\ q\ne0\),那么 ...

  8. L2-019 悄悄关注 (25分) map容器模拟

    代码: 1 //一道模拟水题,就用来给map练手吧 2 #include<stdio.h> 3 #include<string.h> 4 #include<iostrea ...

  9. BKDR字符串哈希

    BKDR字符串哈希 bkdrhash冲突的可能性非常小,但是由于\(hash\)值非常大不能映射到哈希数组地址上,所以可以通过取余,用余数作为索引地址.但这样做造成了可能的地址冲突. #include ...

  10. TCP Wrappers原理及简单实验

    1.TCP Wrappers(简易防火墙)简介TCP_Wrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接(TCP)的特定服务进行安全检测并实现访问控制,界定方式是凡是调用libwr ...