Golang – gin 框架加载多个模板目录
简介
gin默认是使用text/template,只支持加载一个路径下的模板,而且只取最后的名字,所以有相同文件名字的文件,就有可能加载不到了。
gin.Load html Glob,这个是加载模板目录的,查找模板文件的时候,调用的是filepath.Glob(pattern),patter 设置 “templates/**/*”,在Golang之前的版本是可以匹配到目录和文件,但是在现在的稳定版本,跟”tmplates/*/*”的效果是一样的。因此需要加载多级目录就需要使用multitemplate这个库。
代码 package router import ( "dbops/apps/users" "fmt" "io/ioutil" "os" "path" "path/filepath" "strings" " github .com/gin-contrib/multitemplate" "github.com/gin-gonic/gin" ) func getFilelist(path string, stuffix string) (files []string) { // 遍历目录 filepath.Walk(path, func(path string, f os.FileInfo, err error) error { if f == nil { return err } if f.IsDir() { return nil } // 将模板后缀的文件放到列表 if strings.HasSuffix(path, stuffix) { files = append(files, path) } return nil }) return } // LoadTemplateFiles 加载模板 func LoadTemplateFiles(templateDir, stuffix string) multitemplate.Renderer { r := multitemplate.NewRenderer() rd, _ := ioutil.ReadDir(templateDir) for _, fi := range rd { if fi.IsDir() { // 如果是目录 for _, f := range getFilelist(path.Join(templateDir, fi.Name()), stuffix) { // 添加到模板的时候,去掉跟路径 r.AddFromFiles(f[len(templateDir)+1:], f) } } else { if strings.HasSuffix(fi.Name(), stuffix) { // 如果再根目录底下的文件直接添加 r.AddFromFiles(fi.Name(), path.Join(templateDir, fi.Name())) } } } fmt.Println(r) return r } // Run run Server func Run() { engine := gin.Default() // HTML Render加载模板 engine.HTMLRender = LoadTemplateFiles("templates", ".html") engine. Static ("static", "static") engine.GET("/login", func(c *gin.Context){ c.HTML(http.StatusOK,"users/login.html",gin.H{}) }) engine.GET("/", func(c *gin.Context){ c.HTML(http.StatusOK,"dashboard/index.html",gin.H{}) }) engine.Run() }