Go Embed简明教程

Go语言从1.16版本开始支持内建的静态文件嵌入功能,该特性允许开发者将静态资源如html模板直接编译到二进制中。通过`go:embed`指令,可以将单个或多个文件、文件夹嵌入为字符串、字节切片或文件系统FS。本文详细介绍了如何使用这一新特性,并提供了代码示例,包括直接嵌入字符串、字节切片和创建文件系统来读取嵌入文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Go Embed简明教程

go语言程序都是编译成二进制可执行文件的,但是实际执行时除了需要可执行程序,还需要一些静态文件,比如html模板等,于是就有人想如果Go官方能内建支持就好了。2019末一个提案被提出 issue#35950,期望Go官方编译器支持嵌入静态文件。后来Russ Cox专门写了一个设计文档 Go command support for embedded static assets, 并最终实现了它。

  • 需要注意的这个功能在go 1.16beta之后才支持

  • 对于单个的文件,支持嵌入为字符串和 byte slice

  • 对于多个文件和文件夹,支持嵌入为新的文件系统FS

  • 比如导入 "embed"包,即使无显式的使用

    go:embed指令用来嵌入,必须紧跟着嵌入后的变量名

  • 只支持嵌入为string, byte slice和embed.FS三种类型,这三种类型的别名(alias)和命名类型(如type S string)都不可以

嵌入为字符串

假设有一个文件test.txt文件内容为hello world

如下代码编译之后s的值就变成了"hello world"

//go:embed test.txt
var s string

嵌入为byte slice

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

//go:embed test.txt
var b []byte

嵌入为fs.FS

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

支持嵌入多个文件如:

//go:embed test.txt hello.txt       

支持指定文件夹如:

//go:embed file/file.txt

支持多行方式嵌入如:

//go:embed test.txt hello.txt       
//go:embed file/file.txt
//go:embed test.txt hello.txt       
//go:embed file/file.txt
var f embed.FS

// 使用
// 嵌入为文件系统
data, _ :=  f.ReadFile("test.txt")
fmt.Println(string(data))
data, _ = f.ReadFile("hello.txt")
fmt.Println(string(data))

支持嵌入文件夹

//go:embed file
var d embed.FS

完整代码实现

package main

import (
   "embed"
   _ "embed"
   "fmt"
)

//go:embed test.txt
var s string

//go:embed test.txt
var b []byte

//go:embed test.txt hello.txt
//go:embed file/file.txt
var f embed.FS

//go:embed file
var d embed.FS

//go:embed file/*.txt
var pre embed.FS


func main() {
   // 直接嵌入
   fmt.Println(s)
   fmt.Println(b)

   // 嵌入为文件系统
   data, _ :=  f.ReadFile("test.txt")
   fmt.Println(string(data))
   data, _ = f.ReadFile("hello.txt")
   fmt.Println(string(data))
   // 嵌入的时候文件是啥,这里要对应指定为相同的文件路径
   data, _ = f.ReadFile("file/file.txt")
   fmt.Println(string(data))

   data, _ = d.ReadFile("file/file.txt")
   fmt.Println(string(data))

   data, _ = pre.ReadFile("file/name.txt")
   fmt.Println(string(data))
}

关注公众号一起学习新技术

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Achilles.Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值