Golang中使用embed嵌入图标的实现方法

Golang中使用embed嵌入图标的实现方法 我知道有 https://github.com/akavel/rsrc 这个工具可以将图标嵌入到 Windows 的可执行文件中。

有没有办法使用 Go 语言中新的 // embed 来嵌入图标呢?

2 回复

你试过这个吗?

更多关于Golang中使用embed嵌入图标的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在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)
}

注意事项

  1. //go:embed指令必须紧跟在变量声明之前
  2. 嵌入的文件路径是相对于Go源文件的
  3. 可以使用通配符嵌入多个文件
  4. 嵌入的文件在编译时确定,运行时不可修改
  5. 对于Windows可执行文件图标,仍然需要配合资源编译器或使用-ldflags设置图标

使用embed嵌入图标的主要优势是:

  • 无需外部工具
  • 跨平台支持
  • 编译后的可执行文件包含所有资源
  • 简化部署流程
回到顶部