首页 > 其他分享 >Golang: 使用embed内嵌资源文件-转

Golang: 使用embed内嵌资源文件-转

时间:2023-08-14 18:02:18浏览次数:44  
标签:内嵌 string fmt Golang go embed txt resources

转载:https://blog.kakkk.net/archives/71/

embed介绍

首先,embed是 go 1.16才有的新特性,使用方法非常简单,通过 //go:embed指令,在打包时将文件内嵌到程序中。

官方文档:https://pkg.go.dev/embed

快速开始

文件结构

.
├── go.mod
├── main.go
└── resources
└── hello.txt

package main

import (
    _ "embed"
    "fmt"
)

//embed指令↓
//go:embed resources/hello.txt
var s string

func main() {
    fmt.Println(s)
}

//输出:
//hello embed!

 

嵌入为字符串

快速开始就是嵌入为字符串的例子,不再多赘述

 

嵌入为byte slice

可以直接以二进制形式嵌入,即嵌入为 byte slice

同样时快速开始里面的文件结构

我们将代码改成如下:

package main

import (
    _ "embed"
    "fmt"
)

//go:embed resources/hello.txt
var b []byte

func main() {
    fmt.Println(string(b[0]))
    fmt.Println(string(b))
}

//输出:
//h
//hello embed!

嵌入为embed.FS

你甚至能嵌入一个文件系统,此时,你能够读取到目录树和文件树,embed.FS对外存在以下方法:

// 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)

 

映射单个/多个文件

.
├── go.mod
├── main.go
└── resources
    ├── hello1.txt
    └── hello2.txt
package main

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

//go:embed resources/hello1.txt
//go:embed resources/hello2.txt
var f embed.FS

func main() {
    hello1, _ := f.ReadFile("resources/hello1.txt")
    fmt.Println(string(hello1))
    hello2, _ := f.ReadFile("resources/hello2.txt")
    fmt.Println(string(hello2))
}

//输出:
//hello1
//hello2

映射目录

文件结构

.
├── go.mod
├── main.go
└── resources
    ├── dir1
    │   └── dir1.txt
    ├── dir2
    │   ├── dir2.txt
    │   └── dir3
    │       └── dir3.txt
    ├── hello1.txt
    └── hello2.txt
package main

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

//go:embed resources/*
var f embed.FS

func main() {
    hello1, _ := f.ReadFile("resources/hello1.txt")
    fmt.Println(string(hello1))
    hello2, _ := f.ReadFile("resources/hello2.txt")
    fmt.Println(string(hello2))
    dir1, _ := f.ReadFile("resources/dir1/dir1.txt")
    fmt.Println(string(dir1))
    dir2, _ := f.ReadFile("resources/dir2/dir2.txt")
    fmt.Println(string(dir2))
    dir3, _ := f.ReadFile("resources/dir2/dir3/dir3.txt")
    fmt.Println(string(dir3))
}

//输出:
//hello1
//hello2
//dir1
//dir2
//dir3

转载:https://blog.kakkk.net/archives/71/

标签:内嵌,string,fmt,Golang,go,embed,txt,resources
From: https://www.cnblogs.com/yaoshi641/p/17629369.html

相关文章

  • Golang: 如何交叉编译
    0.golang可以交叉编译出不同操作系统运行的程序1.在macm2架构下,golang程序mian文件所在的主目录下,即可生成#在命令行进入项目根目录,并执行以下命令CGO_ENABLED=0GOOS=xxxGOARCH=xxxgobuild参数说明:CGO_ENABLED:是否使用 C语言 版本的 GO 编译器。0 表示不......
  • golang简单实现CLHLock,不可重入的clh自旋锁
    如果不想自旋,可以把Lock、waitIsFinish和noticeIsFinish代码中的方式2注释掉,改用方式1。不过实际测试在低并发的情况下,自旋的执行效率更高,要根据实际业务场景选择使用哪种方式。源代码如下:import("runtime""sync/atomic")const(Gosched_Spin_Count=10000......
  • Golang之旅——内存管理
    转载放在最前一文带你了解,虚拟内存、内存分页、分段、段页式内存管理[Golang三关-典藏版]一站式Golang内存洗髓经|Go技术论坛刘丹冰Aceld感谢以上文章作者,收获满满......
  • RTMP流媒体服务器LntonMedia(免费版)视频直播点播平台采用Golang指针问题导致平台重复推
    我们的团队在研发视频流媒体平台时,广泛应用了Go语言。之前我们也与大家交流过关于Go语言指针的问题和应用。如果你对视频流媒体平台编译中如何运用Go语言指针感兴趣,可以了解一下我们的讨论。在对LntonMedia的编译中,我们发现Golang指针问题会导致系统内的重复推流。Golang遍历切片代......
  • Query on Embedded/Nested Documents
    Thispageprovidesexamplesof queryoperationsonembedded/nesteddocuments usingthe db.collection.find() methodin mongosh.Theexamplesonthispageusethe inventory collection.ConnecttoatestdatabaseinyourMongoDBinstancethencreateth......
  • golang网络编程
    1简介Go语言的网络编程主要使用net包来实现。该包提供了一组基本的网络功能,包括TCP和UDP套接字、IP地址和端口号的处理、以及一些高级特性,如非阻塞I/O和HTTP客户端库。本文简单介绍一下如何使用net包进行TCP通信2TCP通信TCP服务端处理流程:监听端口接收......
  • golang 构造函数的应用
    在Go语言中,没有类似于传统面向对象编程语言中的构造函数的概念。然而,你可以使用初始化函数来达到类似的效果。在Go中,结构体(struct)是一种用于封装一组相关字段的数据类型。你可以为结构体定义一个初始化函数,该函数在创建结构体实例时自动调用,用于设置字段的初始值。这个初始化函数......
  • golang之协程+chan通道
     [管道]分为有缓冲和无缓冲两种无缓冲: 1)接受者与发送者必然存在于两个协程,否则会造成互相等待死锁的情况顺序执行多协程:varch1=make(chanint)varstopFlag=make(chanbool)//保证两个协程顺序执行gofunc(){fmt.Println("g1")......
  • IOS App内嵌H5 swiper 轮播出现卡顿白屏闪烁
    话说在前头:前端开发同学遇到这个问题不慌,因为接下来你要踩的坑我都帮你们踩完了,所以有了这一篇博客。希望能帮到你轮播组件:[email protected](4x稳定的最后一个版本)设备:ios版本15x,14和16版本都挺好的,问题仅在ios15的版本出现现象:左右滑动卡顿,不连手,放开的......
  • golang 学习笔记
    1.函数调用时传递的参数为拷贝的副本,在函数内部改变参数的值不会影响原变量。但是golang中slice、map、channel、pointer、function是引用类型,赋值时拷贝的是指针值,对这些变量作出修改时会影响原变量的值。2.array(数组)与slice(切片)的区别1.array1. 长度......