Go语言如何在同一文件中使用多个匿名结构体为HTML模板传参
解决方案
方案1:统一使用单结构体承载所有需要的字段(最规范推荐)
把成功、失败提示字段合并到同一个匿名(或命名)结构体中,不同场景只给对应字段赋值即可,模板里判断非空渲染,不会出现字段不存在的渲染错误:
// 成功场景 data := struct { Success string Failure string }{Success: "Your account is successfully created"} tmpl.Execute(w, "signup.html", data) // 失败场景 data := struct { Success string Failure string }{Failure: "An account is not created"} tmpl.Execute(w, "signup.html", data)
对应的HTML模板写法:
{{if .Success}} <div class="alert success">{{.Success}}</div> {{end}} {{if .Failure}} <div class="alert error">{{.Failure}}</div> {{end}}
如果多个逻辑都用到这个结构,可以直接定义成命名结构体复用,不用每次写匿名结构体。
方案2:使用map替代结构体(灵活快速)
如果不想重复定义结构体,直接用map传递参数,写法更简洁:
// 成功场景 tmpl.Execute(w, "signup.html", map[string]string{ "Success": "Your account is successfully created", }) // 失败场景 tmpl.Execute(w, "signup.html", map[string]string{ "Failure": "An account is not created", })
模板写法和方案1完全一致。
方案3:保留双匿名结构体,兼容原有逻辑
如果你确实需要保留两个独立的匿名结构体,需要先在模板初始化时开启缺省字段返回零值的配置,再配合with语法判断字段是否为空,避免访问不存在字段报错:
首先初始化模板时添加配置:
tmpl := template.New("").Option("missingkey=zero")
模板写法调整为:
{{with .Success}} <div class="alert success">{{.}}</div> {{end}} {{with .Failure}} <div class="alert error">{{.}}</div> {{end}}
with语句在目标字段值为空时会直接跳过块内逻辑,适配你原来的两套匿名结构体传参逻辑。
内容的提问来源于stack exchange,提问作者sikandar meranam
相关产品推荐
相关产品推荐

