Golang Go语言 embed 初体验

发布于 1周前 作者 vueper 来自 Go语言

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

9 回复

–在开发阶段每次修改前端的内容,都需要执行一次 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包,不妨在你的下一个项目中尝试一下,相信它会给你带来意想不到的惊喜。

回到顶部