Golang embed(内嵌)
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | 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 简明教程