我的编程空间,编程开发者的网络收藏夹
学习永远不晚

golang embed是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

golang embed是什么

本篇内容主要讲解“golang embed是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“golang embed是什么”吧!                          

embed是什么

embed是在Go 1.16中新加入的包。它通过//go:embed指令,可以在编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力。

为什么需要embed

在以前,很多从其他语言转过来Go语言的小伙伴会问到,或者踩到一个坑:就是以为Go语言所打包的二进制文件中会包含配置文件的联同编译和打包。

结果往往一把二进制文件挪来挪去,就无法把应用程序运行起来了,因为无法读取到静态文件的资源。

无法将静态资源编译打包二进制文件的话,通常会有两种解决方法:

  • 第一种是识别这类静态资源,是否需要跟着程序走。

  • 第二种就是将其打包进二进制文件中。

第二种情况的话,Go以前是不支持的,大家就会借助各种花式的开源库,例如:go-bindata/go-bindata来实现。

但是在Go1.16起,Go语言自身正式支持了该项特性。

它有以下优点

  • 能够将静态资源打包到二进制包中,部署过程更简单。传统部署要么需要将静态资源与已编译程序打包在一起上传,或者使用dockerdockerfile自动化前者,这是很麻烦的。

  • 确保程序的完整性。在运行过程中损坏或丢失静态资源通常会影响程序的正常运行。

  • 静态资源访问没有io操作,速度会非常快

embed基础用法

通过 官方文档 我们知道embed嵌入的三种方式:string、bytes 和 FS(File Systems)。其中string[]byte类型都只能匹配一个文件,如果要匹配多个文件或者一个目录,就要使用embed.FS类型。

特别注意:embed这个包一定要导入,如果导入不使用的话,使用 _ 导入即可

一、嵌入为字符串

比如当前文件下有个hello.txt的文件,文件内容为hello,world!。通过go:embed指令,在编译后下面程序中的s变量的值就变为了hello,world!

package mainimport (    _ "embed"    "fmt")//go:embed hello.txtvar s stringfunc main() {    fmt.Println(s)}
二、嵌入为byte slice

你还可以把单个文件的内容嵌入为slice of byte,也就是一个字节数组。

package mainimport (    _ "embed"    "fmt")//go:embed hello.txtvar b []bytefunc main() {    fmt.Println(b)}
三、嵌入为fs.FS

甚至你可以嵌入为一个文件系统,这在嵌入多个文件的时候非常有用。

比如嵌入一个文件:

package mainimport (    "embed"    "fmt")//go:embed hello.txtvar f embed.FSfunc main() {    data, _ := f.ReadFile("hello.txt")    fmt.Println(string(data))}

嵌入本地的另外一个文件hello2.txt, 支持同一个变量上多个go:embed指令(嵌入为string或者byte slice是不能有多个go:embed指令的):

package mainimport (    "embed"    "fmt")//go:embed hello.txt//go:embed hello2.txtvar f embed.FSfunc main() {    data, _ := f.ReadFile("hello.txt")    fmt.Println(string(data))    data, _ = f.ReadFile("hello2.txt")    fmt.Println(string(data))}

当前重复的go:embed指令嵌入为embed.FS是支持的,相当于一个:

package mainimport (    "embed"    "fmt")//go:embed hello.txt//go:embed hello.txtvar f embed.FSfunc main() {    data, _ := f.ReadFile("hello.txt")    fmt.Println(string(data))}

还可以嵌入子文件夹下的文件:

package mainimport (    "embed"    "fmt")//go:embed p/hello.txt//go:embed p/hello2.txtvar f embed.FSfunc main() {    data, _ := f.ReadFile("p/hello.txt")    fmt.Println(string(data))    data, _ = f.ReadFile("p/hello2.txt")    fmt.Println(string(data))}

embed进阶用法

Go1.16 为了对 embed 的支持也添加了一个新包 io/fs。两者结合起来可以像之前操作普通文件一样。

一、只读

嵌入的内容是只读的。也就是在编译期嵌入文件的内容是什么,那么在运行时的内容也就是什么。

FS文件系统值提供了打开和读取的方法,并没有write的方法,也就是说FS实例是线程安全的,多个goroutine可以并发使用。

embed.FS结构主要有3个对外方法,如下:

// Open 打开要读取的文件,并返回文件的fs.File结构.func (f FS) Open(name string) (fs.File, error)// ReadDir 读取并返回整个命名目录func (f FS) ReadDir(name string) ([]fs.DirEntry, error)// ReadFile 读取并返回name文件的内容.func (f FS) ReadFile(name string) ([]byte, error)
二、嵌入多个文件

package mainimport (    "embed"    "fmt")//go:embed hello.txt hello2.txtvar f embed.FSfunc main() {    data, _ := f.ReadFile("hello.txt")    fmt.Println(string(data))    data, _ = f.ReadFile("hello2.txt")    fmt.Println(string(data))}

当然你也可以像前面的例子一样写成多行go:embed:

package mainimport (    "embed"    "fmt")//go:embed hello.txt//go:embed hello2.txtvar f embed.FSfunc main() {    data, _ := f.ReadFile("hello.txt")    fmt.Println(string(data))    data, _ = f.ReadFile("hello2.txt")    fmt.Println(string(data))}
三、支持文件夹

文件夹分隔符采用正斜杠/,即使是windows系统也采用这个模式。

package mainimport (    "embed"    "fmt")//go:embed pvar f embed.FSfunc main() {    data, _ := f.ReadFile("p/hello.txt")    fmt.Println(string(data))    data, _ = f.ReadFile("p/hello2.txt")    fmt.Println(string(data))}

应用

在我们的项目中,是将应用的常用的一些配置写在了.env的一个文件上,所以我们在这里就可以使用go:embed指令。

main.go 文件:

//go:embed ".env" "v1d0/.env"var FS embed.FSfunc main(){    setting.InitSetting(FS)    manager.InitManager()    cron.InitCron()    routersInit := routers.InitRouter()    readTimeout := setting.ServerSetting.ReadTimeout    writeTimeout := setting.ServerSetting.WriteTimeout    endPoint := fmt.Sprintf(":%d", setting.ServerSetting.HttpPort)    maxHeaderBytes := 1 << 20    server := &http.Server{        Addr:           endPoint,        Handler:        routersInit,        ReadTimeout:    readTimeout,        WriteTimeout:   writeTimeout,        MaxHeaderBytes: maxHeaderBytes,    }    server.ListenAndServe()}

setting.go文件:

func InitSetting(FS embed.FS) {    // 总配置处理    var err error    data, err := FS.ReadFile(".env")    if err != nil {        log.Fatalf("Fail to parse '.env': %v", err)    }    cfg, err = ini.Load(data)    if err != nil {        log.Fatal(err)    }    mapTo("server", ServerSetting)    ServerSetting.ReadTimeout  = ServerSetting.ReadTimeout * time.Second    ServerSetting.WriteTimeout = ServerSetting.WriteTimeout * time.Second    // 分版本配置引入    v1d0Setting.InitSetting(FS)}

到此,相信大家对“golang embed是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

golang embed是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

golang embed是什么

本篇内容主要讲解“golang embed是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“golang embed是什么”吧! embed是
2023-06-25

embed是什么函数

在自然语言处理中,Embed是一个函数,用于将文本数据转换为向量表示。它可以将文本的语义信息编码为向量,从而方便进行后续的文本处理和分析任务。具体而言,Embed函数可以将一个文本序列(例如一段话、一篇文章或一个句子)作为输入,然后将其转换
2023-08-24

Excel 控件中的 EMBED 函数是什么意思

在 Excel 控件中,EMBED 函数用于将一个对象嵌入到工作表中。它可用于嵌入其他 Office 文档、PDF、图像、音频、视频等文件。EMBED 函数的语法如下:EMBED(“ProgID”, “optional parameters
2023-09-26

什么是golang

golang是一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言;它可以在不损失应用程序性能的情况下极大的降低代码的复杂性,还可以发挥多核处理器同步多工的优点,并可解决面向对象程序设计的麻烦,并帮助程序设计师处理琐碎但重要的内存管理问题。
2022-11-22

golang Gob是什么

gob是Golang包自带的一个数据结构序列化的编码/解码工具,编码使用Encoder,解码使用Decoder。Gob使用io.Writer 接口,通过NewEncoder()函数创建Encoder对象通过调用Encode()方法实现编码操作;使用io.Reader接口,通过NewDecoder()函数创建Decoder对象并调用Decode()方法完成解码操作。
2023-05-14

golang是什么软件

go 编程语言(又称 golang)是一种由 google 开发的开放源码语言,以其并发性、静态类型、垃圾收集、跨平台性、易用性和广泛的应用而闻名。什么是 Go 编程语言?Go,又称 Golang,是一种由 Google 开发的开放源码编
golang是什么软件
2024-04-21

golang断言是什么

golang断言是一种用于判定某个条件是否为真的机制。它在Go语言中用于判定某个条件是否为真,并在条件不满足时触发相应的操作。通过使用断言,我们可以根据具体类型执行不同的操作,以实现更加灵活和可扩展的程序逻辑。Golang(也被称为Go)是
2023-07-17

golang的web是什么

golang的web是指使用Go语言进行Web开发的一种简洁、高效、高性能的开发方式,其开发特点和优势:1、具有高性能,可以轻松创建数千个协程,并发执行任务;2、具有简洁的语法和代码结构,可以更加专注于业务逻辑的实现;3、具有丰富的标准库和
2023-08-02

golang中map是什么

在golang中,map是一种特殊的数据结构,是一个key(索引)和value(值)形式的无序的集合,也可以称为关联数组或字典;map是一种能够快速寻找值的理想结构,是能够快速根据给定key,找到对应的value的数据结构。
2023-05-14

什么是golang协程

golang协程是一种非常强大和高效的并发机制。过提供轻量级的线程和便捷的通信方式,使得开发者可以方便地编写高并发的程序,协程的使用可以极大地简化并发编程,可以将一个复杂的任务拆分成多个较小的子任务,并将这些子任务以协程的形式并行执行。协程
2023-08-02

golang异步是什么

在golang中,异步是指不按照代码顺序执行,一个异步过程的执行将不再与原有的序列有顺序关系;在异步中,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。golang异步主要是由协程(goroutine)实现的;goroutine用来调用函数,当某个函数被go关键字调用后,go就会创建一个类似协程的东西,来执行这个函数,这样可以轻易的实现并发。
2023-05-14

golang优势是什么

golang优势包括:1、高效性能;2、并发编程;3、简洁的语法;4、强大的标准库;5、跨平台支持;6、静态类型检查;7、强大的工具链。详细介绍:1、高效性能,Golang是一种编译型语言,具有高效的性能,它的运行速度非常快,能够处理大量数
golang优势是什么
2023-12-14

golang中什么是泛型

在golang中,泛型是程序设计语言的一种风格或范式,是指编写模板适应所有类型,只有在具体使用时才定义具体变量类型。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。
2023-05-14

golang主要是做什么

golang主要用于构建高并发的服务器端应用程序,特别适合于处理大量请求和高负载的系统。Golang具有以下几个特点:1、协程和并发,通过goroutines和channels提供了一种简单而高效的并发模型;2、高效的系统编程,通过提供丰富
2023-07-24

golang channel原理是什么

在Go语言中,channel是一种用于传递数据的数据类型。可以把它看作一个通信管道,用于goroutine之间的数据传输。Channel的原理是通过goroutine之间的通信实现数据的同步和共享。它提供了一种安全和有效的方式,确保不同g
2023-10-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录