将GIN的模板资源嵌入二进制

利用statik库将静态资源嵌入二进制,但是GIN并没有提供从http.FileSystem加载模板的方法,所以得手动去加载

主要实现

func initTemplates() *template.Template {
	statikFS, err := fs.New()
	if err != nil {
		log.Fatal(err)
	}
	t := template.New("")
	//找出所有扩展名为.gohtml的文件,将其解析为模板
	err = fs.Walk(statikFS, config.TemplateDir, func(path string, info os.FileInfo, err error) error {
		if filepath.Ext(info.Name()) == ".gohtml" {
			f, err := statikFS.Open(path)
			if err != nil {
				return err
			}

			b, err := ioutil.ReadAll(f)
			if err != nil {
				return err
			}

			_, err = t.New(path[1:]).Parse(string(b)) //此处去掉 path 前的 / 来作为模板的文件名
			if err != nil {
				return err
			}
		}

		return nil
	})

	if err != nil {
		log.Println("Load templates error")
		log.Fatal(err)
	}
	return t
}

之后可以通过SetHTMLTemplate方法加载模板

r := gin.Default()
r.SetHTMLTemplate(initTemplates())