如何将模板输出写入 Golang 中的文件?
How to write template output to a file in Golang?
我使用以下代码工作正常,但现在我想将模板打印到文件并尝试了以下但出现错误
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}
你给错了参数:
err = t.Execute(f, t)
应该是
err = t.Execute(f,[]string{"app1", "app2", "app3"})
您第二次传递给模板执行的参数应该与您第一次传递的参数一致。
首先你要做的是:
t.Execute(os.Stdout, []string{"app1", "app2", "app3"})
第二个:
err = t.Execute(f, t)
您通过了模板本身 (t
)。将其更改为:
err = t.Execute(f, []string{"app1", "app2", "app3"})
您的模板迭代传递的参数(使用 {{range}}
操作),它在您传递切片时起作用,而在传递模板时不起作用,它是一个指向结构的指针,它不是模板引擎可以迭代的东西。
使用数组作为第二个参数,而不是模板本身。
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"
我使用以下代码工作正常,但现在我想将模板打印到文件并尝试了以下但出现错误
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}
你给错了参数:
err = t.Execute(f, t)
应该是
err = t.Execute(f,[]string{"app1", "app2", "app3"})
您第二次传递给模板执行的参数应该与您第一次传递的参数一致。
首先你要做的是:
t.Execute(os.Stdout, []string{"app1", "app2", "app3"})
第二个:
err = t.Execute(f, t)
您通过了模板本身 (t
)。将其更改为:
err = t.Execute(f, []string{"app1", "app2", "app3"})
您的模板迭代传递的参数(使用 {{range}}
操作),它在您传递切片时起作用,而在传递模板时不起作用,它是一个指向结构的指针,它不是模板引擎可以迭代的东西。
使用数组作为第二个参数,而不是模板本身。
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"