Golang中如何将结构体传递到text/template时出现的错误
Golang中如何将结构体传递到text/template时出现的错误 我遇到了一个问题。 我尝试将结构体传递给模板,但值都变成了空
示例:
package main
import (
"fmt"
"log"
"os"
"text/template"
)
var tpl *template.Template
type values struct {
stringPagar string
stringReceber string
}
func init() {
tpl = template.Must(template.ParseFiles("tpl.gohtml"))
}
func main() {
err := os.Remove("test.txt") //删除
if err != nil {
log.Fatal(err)
}
nf, err := os.Create("test.txt")
if err != nil {
log.Fatal(err)
}
defer nf.Close()
fmt.Println("Hello")
valores := values{
stringPagar: "100,200,300",
stringReceber: "400,500,600",
}
tpl.ExecuteTemplate(nf, "tpl.gohtml", valores)
}
我的 tpl.gohtml:
Test
{{.stringPagar}}
Test 2
{{.stringReceber}}
test.txt 中的结果:
Test
有人能帮我吗?
更多关于Golang中如何将结构体传递到text/template时出现的错误的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
成功了。非常感谢
更多关于Golang中如何将结构体传递到text/template时出现的错误的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
values.stringPagar 和 values.stringReceber 需要被导出(即首字母大写)才能从模板内部访问。
- 可在 Go Playground 上运行的版本:https://play.golang.org/p/ICFypEzj0B0
- 在执行模板后/时检查
err的版本:https://play.golang.org/p/h-rOFtCXjkU
第二个版本会在你的终端上打印足够的信息来找到解决方案。
如果还是不行,请询问输出的实际含义,但无论如何,请养成检查返回的 error 的习惯。
问题在于结构体字段的可见性。在Go语言中,只有首字母大写的字段才能被外部包(包括text/template)访问。将结构体字段改为大写即可解决。
修改后的代码:
package main
import (
"fmt"
"log"
"os"
"text/template"
)
var tpl *template.Template
type values struct {
StringPagar string
StringReceber string
}
func init() {
tpl = template.Must(template.ParseFiles("tpl.gohtml"))
}
func main() {
err := os.Remove("test.txt")
if err != nil {
log.Fatal(err)
}
nf, err := os.Create("test.txt")
if err != nil {
log.Fatal(err)
}
defer nf.Close()
fmt.Println("Hello")
valores := values{
StringPagar: "100,200,300",
StringReceber: "400,500,600",
}
err = tpl.ExecuteTemplate(nf, "tpl.gohtml", valores)
if err != nil {
log.Fatal(err)
}
}
模板文件 tpl.gohtml 也需要相应修改:
Test
{{.StringPagar}}
Test 2
{{.StringReceber}}
现在输出到 test.txt 的内容将是:
Test
100,200,300
Test 2
400,500,600
这是因为Go的导出规则要求字段名首字母大写才能被模板引擎访问。小写字段是私有的,只能在定义它们的包内部访问。

