版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://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 简明教程


微信公众号