我正在try 使用html/template来解析 struct 格式的JSON.

func handler(w http.ResponseWriter, r *http.Request) {
    var issueList = template.Must(template.New("template01").ParseFiles("template01.tmpl"))
    result, err := SearchIssues(os.Args[1:])
    if err != nil {
        log.Fatal(err)
    }
    if err := issueList.Execute(w, result); err != nil {
        log.Fatal(err)
    }
}

函数SearchIssues用于将流转换为JSON格式,运行良好.

然后,我try 使用以下命令以html/template为单位解析JSON

var issueList = template.Must(template.New("template01").ParseFiles("template01.tmpl"))

当我访问本地服务时,出现错误:XXX is an incomplete or empty template.

但当我删除New("template01").时,程序运行得很好.

就像这样:

func handler(w http.ResponseWriter, r *http.Request) {
    var issueList = template.Must(template.ParseFiles("template01.tmpl"))
    result, err := SearchIssues(os.Args[1:])
    if err != nil {
        log.Fatal(err)
    }
    if err := issueList.Execute(w, result); err != nil {
        log.Fatal(err)
    }
}

我的母语不是英语,英语不是很好,对不起.

推荐答案

第一个代码的问题是,当您这样做时:

var issueList = template.Must(template.New("template01").
    ParseFiles("template01.tmpl"))

template.New()将创建名为"template01"的新模板.变量issueList将引用该空模板.您将其命名为Template.ParseFiles() method,它将解析"template01.tmpl"文件并创建名为"template01.tmpl"associated模板.变量issueList仍将引用template01模板,而不是从文件中解析的模板.当您调用Template.Excute()时,它将执行指定的(默认)模板issueList,即空template01.这就是您得到错误incomplete or empty template的原因.

在第二个版本中:

var issueList = template.Must(template.ParseFiles("template01.tmpl"))

您调用template.ParseFiles() function,它将解析"template01.tmpl"文件并返回其模板.因此issueList将引用来自文件的解析的模板,而不是空模板.因此Template.Execute()将执行该模板.

注意:如果在第一种情况下使用Template.ExecuteTemplate(),则可以命名要执行的模板:

if err := issueList.Execute(w, "template01.tmpl", result); err != nil {
    log.Fatal(err)
}

这将会成功,因为您显式地告诉执行从文件中解析的"template01.tmpl",而不是默认的空模板.

还要注意的是,您不应该在处理程序中解析模板,这很慢.在此之前解析它一次,将结果存储在包级变量中,并在处理程序中执行它.有关dteail,请参阅It takes too much time when using "template" package to generate a dynamic web page to client in Golang

有关关联模板的详细信息,请参阅Go template name.

另外,请使用encoding/json生成JSON输出,而不是text/templatehtml/template.模板引擎对JSON格式和编码一无所知,很容易生成无效的JSON.

Go相关问答推荐

CGO如何转换为文件*类型

难以为多个平台添加Go Bazel构建选项

Websocket服务器实现与x/net库trowing 403

GO框架Echo中间件的使用

调用库和直接操作效率有区别吗?

切片的下限和上限

Go 中的 protobuf FieldMask 解组

Go Programming Language书上的例子server2错了吗?

在 Cloud Run 中找不到默认凭据

从 eBPF LRU 哈希映射中错误驱逐的元素

Golang 创建一个带有处理程序的模拟数据库并使用接口调用数据库

如何使用泛型将接口转换为指定类型

如何在模板中传递和访问 struct 片段和 struct

为什么 reflect.TypeOf(new(Encoder)).Elem() != reflect.TypeOf(interfaceVariable)?

将shell输出绑定到Go中的 struct 的最佳方法?

如何使用 Status 字段创建 Kubernetes 对象?

从golang中的url加载图像

如何使用golang操作很长的字符串以避免内存不足

go routine 和接收错误或成功的通道

更改单个像素的 colored颜色 - Golang 图像