Golang笔记:使用embed包将静态资源嵌入到程序中

news2024/12/28 5:56:43

文章目录

  • 目的
  • 使用演示
  • //go:embed 指令
  • 在WebServer中应用
  • 总结

目的

Golang编译程序默认是静态编译,会把相关的库都打包到一起,这在分发部署使用时非常方便。不过如果项目中用到的外部的静态资源文件,通常就需要将这些资源和程序一起拷贝分发了。现在可以使用标准库中 embed 包 https://pkg.go.dev/embed 将静态资源文件打包到一起。

使用演示

embed 包支持将文件变成 string []byte 或者 FS 类型的变量引入程序中。下面是一些演示:

package main

import (
	_ "embed"
	"fmt"
)

// 下面一行像是注释的的内容是一条指令
// 它会将后面指定的文件的内容赋值给下面紧挨着声明的变量

//go:embed file1.txt
var s string

//go:embed subdir/file2.txt
var b []byte

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

在这里插入图片描述

下面是 FS 类型演示:

package main

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

// 下面是embed最好用的功能,把文件放到FS中

//go:embed file1.txt
//go:embed subdir/file2.txt
var f embed.FS

func main() {
	data, _ := f.ReadFile("file1.txt")
	fmt.Println(string(data))
	data, _ = f.ReadFile("subdir/file2.txt")
	fmt.Println(string(data))
}

在这里插入图片描述

//go:embed 指令

//go:embed 指令有一些需要注意的点(以下内容根据版本不同可能会有较大变动):

  • 要嵌入的文件支持当前程序目录及子目录;
  • 嵌入的文件系统是只读的,支持 Open ReadDir ReadFile 三个方法进行访问;
  • 一条 //go:embed 指令后面可以写用空格隔开的多个文件,也可以用多条 //go:embed 将文件内容放入一个变量中,比如下面两者是等价的:
    //go:embed file1.txt file2.txt
    var f embed.FS
    
    //go:embed file1.txt
    //go:embed file2.txt
    var f embed.FS
    
  • //go:embed 后也可以跟文件夹,默认情况下不会包含文件夹中 . _ 开头的文件;
  • 可以使用 * 来匹配文件下所有文件(包括 . _ 开头的文件),但 * 不会递归子目录中 . _ 开头的文件;
  • 可以在文件夹名称前加上 all: 来匹配所有文件,并且会递归子目录中 . _ 开头的文件;

在WebServer中应用

embed比较常用的一个应用是在WebServer项目中打包网页静态资源文件,比如下面例子:

目录结构和网页文件内容:
在这里插入图片描述

WebServer代码:

package main

import (
	"embed"
	_ "embed"
	"net/http"
)

//go:embed index.html assets
var content embed.FS

func main() {
	// 使用embed.FS作为WebServer静态文件服务目录
	fs := http.FileServer(http.FS(content))
	http.Handle("/", http.StripPrefix("/", fs))
	http.ListenAndServe(":80", nil)
}

在这里插入图片描述

总结

embed 是一个非常好的工具,可以大大提升编译出的程序的封装性,方便安装部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/536868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试面试大全(涵盖了软件测试的全部核心技术点),应对技术面妥妥的

软件测试面试题:项目 1、简单介绍下最近做过的项目 根据自己的项目整理完成,要点: 1)项目背景、业务、需求、核心业务的流程 2)项目架构,B/S 还是 C/5,数据库用的什么? 中间件用的什么&…

[开源工具] [Unity实战]Jenkins如何配置拉取Git/Jenkins使用Unity一键打包[windows][android]

[开源工具]Jenkins如何配置拉取Git/Jenkins使用Unity一键打包[windows][android] 1.背景介绍1.1Jenkins是什么?1.2用JenkinsUnity的好处? 2.Jenkins安装&使用2.1Java112.2 下载jenkins.war(我用tomcat所以需要,可以用jenkins安装版本)2.3 使用Tomcat92.4将tomcat9解压后,…

1.高级面试-MySQL、Redis、特殊场景、Java

本文目录如下: 高级面试一、MySQLB树有什么优点? image.pngInnoDB 和 MyISAM 的索引结构有什么区别 (聚簇索引-非聚簇索引)? 二、RedisRedis 如何保证存储的都是 热点数据?大量 key 为同一过期时间怎么办?缓存一致性的…

TS构建微信小程序后使用vant weapp框架配置

1.npm 安装 # 通过 npm 安装 npm i vant/weapp -S --production 2.配置app.json 将 app.json 中的 "style": "v2" 去除,小程序的新版基础组件强行加上了许多样式,难以覆盖,不关闭将造成部分组件样式混乱。 3.修改 pr…

ubuntu20 kvm显卡直通实验-a4000

一、环境: 显卡:NVIDIA RTX A4000 系统:Ubuntu20.04 CPU:intel二、安装kvm sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager ovmf添加用户到“libvirt”和“kvm”组 s…

个人简历上的照片有什么要求?这些基本要求要知道

简历对我们来说非常重要,因为它可以帮助我们展示我们的工作经验、技能和教育背景,从而让面试者更好地了解我们的能力和合适程度。简历通常是我们与公司之间的第一次接触,因此它应该清晰、简洁和易于阅读,以便引起面试者的兴趣&…

【机械硬盘重新挂载】

一、背景描述 目前机器上有一个6.5T的机械硬盘,挂在为/home目录,但是目前处于公司业务需要,需要将机械硬盘重新挂载为/data,但是/home与/data中都有业务数据,需要我们谨慎操作。 二、概念解析 挂载源:要…

机器学习项目实战-能源利用率 Part-1(数据清洗)

1. 项目背景 2009年的《当地法案84号》,或纽约市基准法案,要求对能源和用水量进行年度基准测试和披露信息。被覆盖的财产包括单个建筑物的税收地块,其总建筑面积大于50,000平方英尺(平方英尺),以及具有超过…

CISP-PTE认证是什么?含金量有多高?

CISP即“注册信息安全专业人员”,由中国信息安全测评中心根据中央编办授权,系国家对信息安全人员资质的最高认可。那么,CISP-PTE认证又是什么呢?它的含金量又有多高?下面,国科科技就为你介绍。 CISP-PTE是…

什么是Redisson分布式锁?有什么作用?

前言: 如果你的简历中写了做过电商项目,那么面试官基本都会从SpringBoot、SpringCloud以及Dubbo这些微服务架构涉及的知识问起,然后深入到问什么是分布事务、分布式锁以及分布式缓存等内容。 这篇文章主要聊聊什么是Redisson分布式锁&#…

【Java EE 初阶】线程安全及死锁解决方案

目录 1.多线程下线程不安全的问题 1.使用多个线程对Array List集合进行添加操作并打印,查看结果 2.如何在多线程环境下使用线程安全的集合类 CopyOnWriteArrayList 3.多线程环境下使用队列 4.多线程环境下使用哈希表 1.HashTable线程安全 2.Concurrent Hash M…

yolov8训练记录

resume: 将model设置为最近一次训练的权重路径 (last.pt) resume设置为True YOLOv8 在 Python 环境中直接使用,不用 ultralytics 库 pip uninstall ultralytics 原因:安装 ultralytics 库,只能在虚拟环境中使用,自己修改代码非常…

ACM 1004 | 母牛的故事

文章目录 0x00 前言 0x01 题目描述 0x02 问题分析 0x03 代码设计 0x04 完整代码 0x05 运行效果 0x06 总结 0x00 前言 C 语言网不仅提供 C 语言,还包括 C 、 java 、算法与数据结构等课程在内的各种入门教程、视频录像、编程经验、编译器教程及软件下载、题解博…

新库上线 | CnOpenData·A股上市公司担保数据

A股上市公司担保数据 一、数据简介 “对外担保”,是指上市公司为他人提供的担保,包括上市公司对控股子公司的担保。“上市公司及其控股子公司的对外担保总额”,是指包括上市公司对控股子公司担保在内的上市公司对外担保总额与上市公司控股子…

初级数据结构——栈和队列

目录 1.栈栈的概念及结构栈的实现栈的结构初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈Stack.hStack.cTest.c 2.队列队列的概念及结构队列的实现队列的结构初始化队列队尾入队列队头出队列获取队列头部元素获取队列队尾元素获取队列中有效元素个数检…

【FATE联邦学习】model not init, call init_model() function

太长不看版 在local_mode下,不要使用t.CustModel进行实例化,而是直接使用原本的类进行实例化。 如果你设置了trainer.local_mode(),那么trainer里面的model不可以是t.CustModel()的实例。 给几个example: 正确: mod…

2023年美国大学生数学建模竞赛B题重塑马赛马拉的形象解题全过程文档及程序

2023年美国大学生数学建模竞赛 B题 重塑马赛马拉的形象 原题再现: 背景介绍   肯尼亚的野生动物保护区最初主要是为了保护野生动物和其他自然资源而设立的。肯尼亚议会通过了2013年《野生动物保护和管理法》, 以提供更公平的资源共享,以及…

重新定义新增长,从百果园看ESG如何可持续

当下,企业的增长亟待重新定义。 中国已基本告别人口红利时代,不少行业和企业当前陷入增长困境。原来以规模定义的增长很难实现,一些企业在日常运营中找不到方向和方式,因此需要重新定义“增长”。 最终,在环境恶化、…

计算机图形学-GAMES101-7

引言 场景中有很多的三角形,如果实现可见性和遮挡呢?  一个简单的想法是,从远到近画,近处的物体自然会覆盖掉远处的物体,这种画法也叫画家算法。  但是实际绘制中物体的顺序是不容易确定的,比如如下图绘制…

下载和安装appuploader

转载:下载和安装appuploader IOS开发工具官网地址 Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 最新版本已经优化了没支付688给apple的账号登录流程,无需再安装其他软件。…