2

对于解析文件,我为 template.ParseFiles 设置了一个变量,我目前必须手动设置每个文件。

两件事情:

我如何能够遍历一个主文件夹和多个子文件夹并自动将它们添加到 ParseFiles,这样我就不必单独手动添加每个文件?

我如何能够在子文件夹中调用具有相同名称的文件,因为目前如果我在 ParseFiles 中添加同名文件,我会在运行时出错。

var templates = template.Must(template.ParseFiles(
    "index.html", // main file
    "subfolder/index.html" // subfolder with same filename errors on runtime
    "includes/header.html", "includes/footer.html",
))


func main() {
    // Walk and ParseFiles
    filepath.Walk("files", func(path string, info os.FileInfo, err error) {
        if !info.IsDir() {
            // Add path to ParseFiles


        }
        return
    })

    http.HandleFunc("/", home)
    http.ListenAndServe(":8080", nil)
}

func home(w http.ResponseWriter, r *http.Request) {
    render(w, "index.html")
}

func render(w http.ResponseWriter, tmpl string) {
    err := templates.ExecuteTemplate(w, tmpl, nil)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}
4

2 回答 2

4

要遍历目录查找文件,请参阅: http: //golang.org/pkg/path/filepath/#Walkhttp://golang.org/pkg/html/template/#Newhttp://golang.org /pkg/html/template/#Template.Parse

至于您的其他问题 ParseFiles 使用文件的基本名称作为模板名称,这会导致您的模板发生冲突。你有两个选择

  1. 重命名文件。
  2. 用于t := template.New("name of your choice")创建初始模板
    1. 使用您已经启动的 walk 函数并调用t.Parse("text from file")每个模板文件。您必须自己打开并阅读模板文件的内容才能在此处传递。

编辑:代码示例。

func main() {
    // Walk and ParseFiles
    t = template.New("my template name")
    filepath.Walk("files", func(path string, info os.FileInfo, err error) {
        if !info.IsDir() {
            // Add path to ParseFiles
            content := ""
            // read the file into content here
            t.Parse(content)
        }
        return
    })

    http.HandleFunc("/", home)
    http.ListenAndServe(":8080", nil)
}
于 2012-10-09T19:40:23.337 回答
0

所以基本上我在遍历文件夹时设置了 New("path name i want").Parse("String from read file")。

var templates = template.New("temp")

func main() {
    // Walk and ParseFiles
    parseFiles()

    http.HandleFunc("/", home)
    http.ListenAndServe(":8080", nil)
}

//////////////////////
// Handle Functions //
//////////////////////
func home(w http.ResponseWriter, r *http.Request) {
    render(w, "index.html")
    render(w, "subfolder/index.html")
}

////////////////////////
// Reusable functions //
////////////////////////
func parseFiles() {
    filepath.Walk("files", func(path string, info os.FileInfo, err error) error {
        if !info.IsDir() {
            filetext, err := ioutil.ReadFile(path)
        if err != nil {
                return err
        }
        text := string(filetext)
            templates.New(path).Parse(text)
        }
        return nil
    })
}

func render(w http.ResponseWriter, tmpl string) {
    err := templates.ExecuteTemplate(w, tmpl, nil)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}
于 2012-10-10T16:53:00.020 回答