Golang中使用embed嵌入图标的实现方法
Golang中使用embed嵌入图标的实现方法 我知道有 https://github.com/akavel/rsrc 这个工具可以将图标嵌入到 Windows 的可执行文件中。
有没有办法使用 Go 语言中新的 // embed 来嵌入图标呢?
2 回复
在Go 1.16+中,可以使用embed包将图标文件嵌入到可执行文件中。以下是几种实现方法:
方法1:嵌入单个图标文件
package main
import (
_ "embed"
"io"
"os"
)
//go:embed icon.ico
var iconData []byte
func main() {
// 将嵌入的图标写入临时文件
tmpFile, err := os.CreateTemp("", "icon-*.ico")
if err != nil {
panic(err)
}
defer os.Remove(tmpFile.Name())
defer tmpFile.Close()
if _, err := tmpFile.Write(iconData); err != nil {
panic(err)
}
// 现在可以使用tmpFile.Name()作为图标路径
fmt.Println("图标已保存到:", tmpFile.Name())
}
方法2:嵌入多个图标文件
package main
import (
"embed"
"io/fs"
)
//go:embed icons/*.ico
var iconFS embed.FS
func main() {
// 读取特定图标
data, err := iconFS.ReadFile("icons/app.ico")
if err != nil {
panic(err)
}
// 列出所有嵌入的图标
entries, err := iconFS.ReadDir("icons")
if err != nil {
panic(err)
}
for _, entry := range entries {
fmt.Println("嵌入的图标:", entry.Name())
}
}
方法3:配合fyne等GUI框架使用
package main
import (
_ "embed"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"image/color"
)
//go:embed app.ico
var iconBytes []byte
func main() {
myApp := app.New()
// 创建内存中的图标资源
iconResource := fyne.NewStaticResource("app.ico", iconBytes)
window := myApp.NewWindow("带图标的应用")
window.SetIcon(iconResource)
window.SetContent(...)
window.ShowAndRun()
}
方法4:Windows系统托盘图标示例
package main
import (
_ "embed"
"github.com/getlantern/systray"
)
//go:embed tray.ico
var trayIcon []byte
func main() {
systray.Run(onReady, onExit)
}
func onReady() {
// 直接使用嵌入的字节数据设置图标
systray.SetIcon(trayIcon)
systray.SetTitle("我的应用")
systray.SetTooltip("Go应用系统托盘")
mQuit := systray.AddMenuItem("退出", "退出应用")
go func() {
<-mQuit.ClickedCh
systray.Quit()
}()
}
func onExit() {
// 清理代码
}
方法5:Web服务器中嵌入favicon
package main
import (
_ "embed"
"net/http"
)
//go:embed favicon.ico
var favicon []byte
func main() {
http.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "image/x-icon")
w.Write(favicon)
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("首页"))
})
http.ListenAndServe(":8080", nil)
}
注意事项
//go:embed指令必须紧跟在变量声明之前- 嵌入的文件路径是相对于Go源文件的
- 可以使用通配符嵌入多个文件
- 嵌入的文件在编译时确定,运行时不可修改
- 对于Windows可执行文件图标,仍然需要配合资源编译器或使用
-ldflags设置图标
使用embed嵌入图标的主要优势是:
- 无需外部工具
- 跨平台支持
- 编译后的可执行文件包含所有资源
- 简化部署流程

