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.stringPagarvalues.stringReceber 需要被导出(即首字母大写)才能从模板内部访问。

  1. 可在 Go Playground 上运行的版本:https://play.golang.org/p/ICFypEzj0B0
  2. 在执行模板后/时检查 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的导出规则要求字段名首字母大写才能被模板引擎访问。小写字段是私有的,只能在定义它们的包内部访问。

回到顶部