Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc

引言

Golang编译成单个bin文件,发布的时候相当方便了。但是某个配置文件没有办法直接打在bin文件中,比如SSL的密钥,html模板等等。
Golang 1.16 标准库引入了embed包,它可以在编译期间将外部文件嵌入到bin包中。

  • 嵌入的文件都是只读的,因此是协程安全的。
  • 另外由于编译期间嵌入的,因此如果文件发生变化,需要重新编译。

2. 示例

2.2 示例1 嵌入文件夹

传送门

.
├── html
│   ├── a.html
│   └── index.html
└── main.go
package main

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

//go:embed html
var content embed.FS

func main() {
    mutex := http.NewServeMux()
    mutex.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(content))))
    err := http.ListenAndServe(":8080", mutex)
    if err != nil {
        log.Fatal(err)
    }
}

2.2 示例2 嵌入模板文件

传送门

.
├── main.go
└── template
    ├── hello.tpl
    └── hello2.tpl
package main

import (
    "bytes"
    "embed"
    "html/template"
    "log"
)

//go:embed template/*.tpl
var mytpl embed.FS

func main() {
    check := func(err error) {
        if err != nil {
            log.Fatal(err)
        }
    }
    list, err := mytpl.ReadDir("template")
    check(err)
    for _, item := range list {
        log.Println("template/" + item.Name())
    }

    data, err := mytpl.ReadFile("template/hello.tpl")
    log.Println("data:", string(data))
    check(err)
    t, err := template.New("hello").Parse(string(data))

    content := bytes.NewBufferString("")
    err = t.Execute(content, map[string]string{"name": "张三"})
    check(err)
    log.Println(content.String())
}

2.3 示例3 嵌入字符串/字节数据

传送门

.
├── main.go
└── variable
    ├── data.txt
    └── data2.txt
package main

import (
    _ "embed"
)

//go:embed variable/data.txt
var data1 string

//go:embed variable/data2.txt
var data2 []byte

func main() {
    println("data1:", data1)
    println("data2:", string(data2))
}

5. 参考资料

1.Goland embed
2.Go embed 简明教程


微信公众号

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据