在Revel及所有基于Go text/template或html/template的框架中,模板无法访问结构体中小写字母开头的字段。这不是Revel的限制,而是Go语言反射机制的设计——只有导出的字段(首字母大写)才能在包外部被访问。若使用小写字段向模板传数据,程序会报错“unexported fi
在Revel及所有基于Go text/template或html/template的框架中,模板无法访问结构体中小写字母开头的字段。这不是Revel的限制,而是Go语言反射机制的设计——只有导出的字段(首字母大写)才能在包外部被访问。若使用小写字段向模板传数据,程序会报错“unexported field”。
解决方案很简单:将模板中使用的字段名改为大写开头,并确保字段类型本身也是导出的。
长期稳定更新的攒劲资源: >>>点此立即查看<<<

假设有以下两个结构体:
type company struct {
tradetotals float64
totals float64
costCount string
traderCount string
}
type AllData struct {
company []company // 小写,非导出
}
此时模板无法获取company切片中的任何数据。正确的做法是将结构体本身及其所有字段改为导出形式:
type Company struct {
Tradetotals float64
Totals float64
CostCount string
TraderCount string
}
type AllData struct {
Company []Company // 大写,导出,模板可用
}
需要注意一个容易忽略的细节:结构体名company(小写)本身也是非导出的。即使将字段改为Company,若结构体类型仍是私有的,在某些情况下仍可能出问题。因此最佳做法是将结构体也命名为Company(导出类型)。
在控制器中传递数据:
func (c App) Index() revel.Result {
data := AllData{
Company: []Company{
{Tradetotals: 123.45, Totals: 678.9, CostCount: "5", TraderCount: "3"},
{Tradetotals: 200.0, Totals: 800.0, CostCount: "12", TraderCount: "7"},
},
}
return c.Render(data)
}
模板中遍历数据:
{{range $index, $comp := .Company}}
{{end}}
Company、Tradetotals。保持命名一致可减少混淆。{{if .Company}}...{{end}}。若传入的数据中切片为nil,直接循环会触发panic。{{printf "%#v" .}},输出实际传入的数据结构,便于排查问题。.User.Profile.Company.Name),均可正常访问。这条导出规则并非Revel特有,而是整个Go模板系统的底层约定——text/template和html/template均遵循此设计。理解和遵守这一规则,数据就能安全、流畅地渲染到前端,避免因“unexported field”错误而中断开发流程。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述