gpt4 book ai didi

go - 文本/模板问题 Parse() 与 ParseFiles()

转载 作者:IT王子 更新时间:2023-10-29 00:33:53 26 4
gpt4 key购买 nike

我正在尝试使用 text/template 包做一些简单的工作。 template 顶部给出的示例是我正在使用的。

如何编写“已解析”文件以便 template.ParseFiles() 正确读取和执行它?

package main

import (
"text/template"
"os"
)

type Inventory struct {
Material string
Count uint
}

func main() {
sweaters := Inventory{"wool", 17}
tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}")
// tmpl, err := template.New("test").ParseFiles("file.txt")

if err != nil { panic(err) }
err = tmpl.Execute(os.Stdout, sweaters)
if err != nil { panic(err) }
}

/*
Contents of file.txt:
{{.Count}} items are made of {{.Material}}

Error thrown:
panic: template: test:1: "test" is an incomplete or empty template

goroutine 1 [running]:
main.main()
/tmp/templates/t.go:19 +0x21a

goroutine 2 [syscall]:
created by runtime.main
/var/tmp/portage/dev-lang/go-1.0.1/work/go/src/pkg/runtime/proc.c:221
*/

我在 golang Playground 上发布了这段代码的副本 here

编辑 #1:我一直在研究这个问题...因为实际上是 Execute() 方法抛出异常,而不是 ParseFiles() 部分,我检查了方法定义:

// Execute applies a parsed template to the specified data object,
// and writes the output to wr.
func (t *Template) Execute(wr io.Writer, data interface{}) (err error) {
defer errRecover(&err)
value := reflect.ValueOf(data)
state := &state{
tmpl: t,
wr: wr,
line: 1,
vars: []variable{{"$", value}},
}
if t.Tree == nil || t.Root == nil {
state.errorf("%q is an incomplete or empty template", t.name)
}
state.walk(value, t.Root)
return
}

因此,凭直觉,我将 t.Tree 的值转储为内联“非文件”样式,tmpl 是:&parse.Tree{Name:"test", Root:(*parse.ListNode )(0xf840030700), funcs:[]map[string]interface {}(nil), lex:(*parse.lexer)(nil), token:[2]parse.item{parse.item{typ:6, val :""}, parse.item{typ:9, val:"{{"}}, peekCount:1, vars:[]string(nil)} 和 当使用 ParseFiles() 运行时,tmpl 是:(*parse.Tree)(nil)。我觉得很奇怪,一个是取消引用,一个值是指针。这可能有助于解开谜团

最佳答案

sweaters := Inventory{"wool", 17}
tmpl, err := template.ParseFiles("file.txt")
if err != nil {
panic(err)
}
err = tmpl.ExecuteTemplate(os.Stdout, "file.txt", sweaters)
if err != nil {
panic(err)
}

如果你有很多文件,你可以使用 ParseGlob:

tmpl, err := template.ParseGlob("*.txt")
if err != nil {
panic(err)
}
err = tmpl.ExecuteTemplate(os.Stdout, "file.txt", sweaters)
if err != nil {
panic(err)
}
err = tmpl.ExecuteTemplate(os.Stdout, "file2.txt", sweaters)
if err != nil {
panic(err)
}

关于go - 文本/模板问题 Parse() 与 ParseFiles(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11805356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com