如何使用Golang在HTML模板中渲染切片里指定的结构体字段数据
问题原因
你调用HomeTmpl.Execute(w, Detail)时传入的参数是[]Details类型的切片,此时Go模板的根上下文.指向整个切片,而非单个Details结构体,直接写{{.Heading}}自然无法匹配到对应字段,所以不生效。
解决方案
分两种常见场景实现:
场景1:渲染切片内所有商品数据
第一步:修改GoHTML模板,使用range遍历切片
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>商品列表</title> </head> <body> <h1>在售服饰</h1> <!-- 遍历根上下文对应的切片,循环内的.指向单个Details结构体 --> {{range .}} <div class="cloth-item"> <h3>{{.Heading}}</h3> <p>价格:{{.Price}}</p> </div> {{end}} </body> </html>
第二步:补全模板初始化逻辑
完整可运行的后端代码如下:
package main import ( "html/template" "net/http" ) type Details struct { Heading string Price string } var Detail = []Details{ { Heading: "First Cloth", Price: "$59", }, { Heading: "Second Cloth", Price: "$49", }, } // 提前解析模板文件,注意替换成你自己的模板实际路径 var HomeTmpl = template.Must(template.ParseFiles("home.gohtml")) func Main(w http.ResponseWriter, r *http.Request) { // 传入整个切片,模板会自动遍历渲染 HomeTmpl.Execute(w, Detail) } func main() { http.HandleFunc("/", Main) // 启动服务后访问localhost:8080即可看到效果 _ = http.ListenAndServe(":8080", nil) }
场景2:仅渲染指定的单条数据
如果不需要渲染全部,只想展示某一条数据,不需要修改{{.Heading}}的模板写法,只要在执行渲染时传入单个Details结构体即可:
func Main(w http.ResponseWriter, r *http.Request) { // 比如渲染切片下标为1的第二条商品,此时根上下文是单个结构体 HomeTmpl.Execute(w, Detail[1]) }
内容的提问来源于stack exchange,提问作者user17393078
相关产品推荐
相关产品推荐

