3

我正在尝试使用 walk in a folder 动态解析文件,并且我希望能够设置文件“path/file.html”的路径。但我的问题是,如果我在文件夹“path/folder/files.html”中有一个文件,我不能这样做,因为当我ExecuteTemplate的文件名将是相同的“files.html”时。是否可以将每个模板命名为 I ParseFiles?

如果尝试一次完成所有文件都行不通,我可以一次处理一个文件。

// Parse file and send to responsewriter
func View(w http.ResponseWriter, path string) {
    temp, err := template.ParseFiles("application/views/"+path+".html")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    } else {
        temp.ExecuteTemplate(w, path, nil)
    }
}
4

2 回答 2

3

使用filepath.Walk和 一种consumer方法遍历文件系统,该方法将创建具有完整文件路径作为名称的模板:

package main

import (
    "fmt"
    "html/template"
    "os"
    "path/filepath"
)

func consumer(p string, i os.FileInfo, e error) error {
    t := template.New(p)
    fmt.Println(t.Name())
    return nil
}

func main() {
    filepath.Walk("/path/to/template/root", filepath.WalkFunc(consumer))
}
于 2012-09-14T21:47:27.237 回答
0

你可以试试template.Lookup,整个过程是这样的:

var (
   templates *template.Template 
)

func loadTemplate() {
    funcMap := template.FuncMap{        
        "safe":func(s string) template.HTML {
            return template.HTML(s)
        },
    }
    var err error
    templates, err = utils.BuildTemplate("/theme/path/", funcMap)
    if err != nil {
        log.Printf("Can't read template file %v,", err)
    }   
 }
func homeHandler(w http.ResponseWriter, r *http.Request) {  
        //lookup the theme your want to use
    templ = templates.Lookup("theme.html")
    err := templ.Execute(w, data)
    if err != nil {
        log.Println(err)
    }
 }

 func main() {
   loadTemplate()
 }

BuildTemplate 看起来像:

func BuildTemplate(dir string, funcMap template.FuncMap) (*template.Template, error) {
    fs, err := ioutil.ReadDir(dir)
    if err != nil {
        fmt.Printf("Can't read template folder: %s\n", dir)
        return nil, err
    }
    files := make([]string, len(fs))
    for i, f := range (fs) {
        files[i] = path.Join(dir, f.Name())
    }
    return template.Must(template.New("Template").Funcs(funcMap).ParseFiles(files...)), nil
}
于 2013-02-10T10:32:52.457 回答