【问题标题】:How to write template output to a file in Golang?如何将模板输出写入 Golang 中的文件?
【发布时间】:2018-11-24 19:50:27
【问题描述】:

我使用以下代码可以正常工作,但现在我想将模板打印到文件并尝试以下但出错

package main

import (
    "html/template"
    "log"
    "os"
)

func main() {
    t := template.Must(template.New("").Parse(`{{- range .}}{{.}}:
    echo "from {{.}}"
{{end}}
`))
    t.Execute(os.Stdout, []string{"app1", "app2", "app3"})

    f, err := os.Create("./myfile")
    if err != nil {
        log.Println("create file: ", err)
        return
    }
    err = t.Execute(f, t)
    if err != nil {
        log.Print("execute: ", err)
        return
    }
    f.Close()
}

错误是:

execute: template: :1:10: executing "" at <.>: range can't iterate over {0xc00000e520 0xc00001e400 0xc0000b3000 0xc00009e0a2}

【问题讨论】:

    标签: templates go go-templates


    【解决方案1】:

    您第二次传递给模板执行的参数应该与您第一次传递的参数相匹配。

    首先你要做:

    t.Execute(os.Stdout, []string{"app1", "app2", "app3"})
    

    第二次做:

    err = t.Execute(f, t)
    

    您传递了模板本身 (t)。改成:

    err = t.Execute(f, []string{"app1", "app2", "app3"})
    

    您的模板迭代传递的参数(使用{{range}} 操作),当您传递一个切片时它起作用,而在传递模板时它不起作用,它是一个指向结构的指针,它不是模板引擎的东西可以迭代。

    【讨论】:

      【解决方案2】:

      你给了一个错误的参数:

      err = t.Execute(f, t)
      

      应该是

      err = t.Execute(f,[]string{"app1", "app2", "app3"})
      

      【讨论】:

        【解决方案3】:

        使用数组作为第二个参数,而不是模板本身。

        package main
        
        import (
                "html/template"
                "log"
                "os"
        )
        
        func main() {
                t := template.Must(template.New("").Parse(`{{- range .}}{{.}}:
                echo "from {{.}}"
        {{end}}
        `))
                t.Execute(os.Stdout, []string{"app1", "app2", "app3"})
        
                f, err := os.Create("./myfile")
                if err != nil {
                        log.Println("create file: ", err)
                        return
                }
                err = t.Execute(f, []string{"app1", "app2", "app3"})
                if err != nil {
                        log.Print("execute: ", err)
                        return
                }
                f.Close()
        }
        

        输出:

        app1:
            echo "from app1"
        app2:
            echo "from app2"
        app3:
            echo "from app3"
        

        myfile的内容是,

        app1:
            echo "from app1"
        app2:
            echo "from app2"
        app3:
            echo "from app3"
        

        【讨论】:

          猜你喜欢
          • 2016-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-12
          • 2016-03-18
          • 2014-05-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多