Go后端渲染数据库数据到HTML提示can't evaluate field错误如何解决
错误原因
你在profile函数中传给模板的table变量是[]showregister类型(用户数据切片),但HTML模板直接访问.Namadepan,这个是单个showregister结构体才有的字段,切片本身没有该字段,因此触发报错。
解决方案
根据你的需求可二选一修改:
场景1:需要在页面展示所有注册用户
无需修改Go后端代码,只需调整HTML模板,使用range遍历传入的用户切片即可:
<div class="col-md-9" style="margin-top: 10px"> <!-- range会遍历传入的用户切片,循环体内的.就是单个showregister结构体 --> {{range .}} <div class="user-item"> <input type="text" class="form-control" value=""> <p class="text-black">{{ .Namadepan }} {{ .Namabelakang }}</p> <!-- 如需展示其他字段,可按照相同格式添加,例如: <p>邮箱:{{.Email}} 年龄:{{.Usia}}</p> --> </div> {{end}} </div>
场景2:仅需要展示单个用户信息
无需修改HTML模板,只需调整Go后端的profile函数,传入单个showregister结构体而非整个切片即可:
func profile(w http.ResponseWriter, r *http.Request){ var tampile = template.Must(template.ParseFiles("./template/profile.html")) table := Showprofile() // 先判空避免切片为空时索引越界 if len(table) == 0 { fmt.Fprintln(w, "暂无用户数据") return } // 这里改为传入切片中单个元素,示例取第一个元素,可根据业务逻辑调整取指定索引的元素 var salahe = tampile.ExecuteTemplate(w, "Profile", table[0]) if salahe!=nil { fmt.Println( salahe.Error() ) return } }
额外优化建议
- 你的
Showprofile函数中写了两次defer db.Close(),属于重复逻辑,删除第二次的即可 - 函数中
err != nil的判断分支是空的,建议补充错误日志打印,方便后续排查数据库查询相关问题
内容的提问来源于stack exchange,提问作者user16815220
相关产品推荐
相关产品推荐

