Golang Go语言 embed 初体验
Golang Go语言 embed 初体验
Go embed (把静态资源打包进可执行文件中) 已经出来很久了,但我一直懒惰没用起来。最近对自己做的一个软件升级,尝试了一下,比想象中好用。
我做的是一个自用的密码管理器,给 MacOS, Windows, Linux 三大平台都打包了,大家可以试试看效果,下载地址 https://github.com/ahui2016/mima/releases/ 下载并解压缩后得到一个文件,无需安装,直接运行即可,通过 http://127.0.0.1 访问操作界面,如果遇到端口冲突可使用 -addr
参数修改端口,例如:
mima.exe -addr 127.0.0.1:8080
两种模式
如果单纯使用 Go embed, 由于静态资源都打包到可执行文件里了,在开发阶段每次修改前端的内容,都需要执行一次 go build 才能反映变化。也就说,发布时简单,但开发时很不方便。
解决办法也简单,增加一个 debug 模式即可:
mima.exe -debug
在 debug 模式下,修改前端的 HTML/JS 文件,不需要重新打包,不需要重启后端,只要刷新网页就行。(有时需要 Ctrl+Shift+R 强制刷新)
实现这个模式的代码在这个项目的 main.go 文件里。
更多关于Golang Go语言 embed 初体验的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
–在开发阶段每次修改前端的内容,都需要执行一次 go build 才能反映变化
可以用 FS 数组搞个别名,然后实现 Open 方法。按数组顺序判断一个 FS 有没有文件,有的话就显示。
更多关于Golang Go语言 embed 初体验的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
确实很好,本人项目用了 :) 另外修一下 xss 简单测试下 https://mimademo.ai42.xyz/public/search.html 搜索 test 有惊喜
同样之前用 Go embed 改写了一个电影资源爬虫项目 https://github.com/hezhizheng/go-movies
也是一个好办法
感谢提醒!
看到你的项目我才发现 gox !
持久化怎么做的
没装 是当前目录下 一个 sqlite 文件么
文档里可以说下持久化怎么处理的
提供下参数 来支持配置数据存放目录
可以不用 不能没有 🐶
你这个意见非常合理,谢谢!已经加上相关功能和说明了。
go embed 确实好用,不过可以考虑用前后端分离的方式,前端开发不需要重启后端,开发完成再把前端打的包用 go embed 引入
对,我目前就是采用类似的方式,只是我加了一个开关,在启动程序时可以选择用 go embed 里的资源还是用本地文件夹里的资源,如果选择本地文件夹,前端刷新就能看到变化。
在Golang中,embed
包无疑是一个令人兴奋的新特性,它允许开发者将文件(如图片、HTML模板、配置文件等)直接嵌入到Go程序中,从而在编译时而非运行时加载这些资源。这一特性极大地简化了资源的管理和分发,减少了外部依赖,提高了程序的健壮性和安全性。
使用embed
包非常简单。首先,你需要在Go文件中导入embed
包,并使用//go:embed
指令来指定要嵌入的文件或目录。例如,如果你有一个名为hello.txt
的文件想要嵌入,你可以这样做:
package main
import (
"embed"
"fmt"
"io/fs"
"log"
)
//go:embed hello.txt
var helloFile embed.FS
func main() {
data, err := helloFile.ReadFile("hello.txt")
if err != nil {
log.Fatalf("读取文件失败: %v", err)
}
fmt.Println(string(data))
}
此外,embed
包还支持将多个文件或整个目录嵌入为文件系统(FS
类型),这对于构建静态Web服务器或处理模板文件特别有用。例如,你可以将HTML模板文件嵌入到程序中,并在运行时动态渲染它们。
虽然embed
包带来了一些优势,如简化资源管理、减少外部依赖和提高安全性,但它也带来了一些挑战,如编译时间增加和二进制体积膨胀。然而,这些挑战通常是可以接受的,因为embed
包所提供的便利性和安全性远远超过了这些缺点。
总的来说,embed
包是Golang中一个非常有用的特性,它让资源管理和代码管理更加紧密地结合在一起。如果你还没有尝试过embed
包,不妨在你的下一个项目中尝试一下,相信它会给你带来意想不到的惊喜。