为了账号安全,请及时绑定邮箱和手机立即绑定

Go 模板中的结构变量名称

Go 模板中的结构变量名称

Go
Cats萌萌 2021-06-29 10:23:30
我正在尝试使用内置的 http/template 库将结构传递到 Go 模板中。但是,我发现如果我用第一个字母小写命名结构的变量,它们不会在模板中呈现,但如果我用第一个字母大写命名它们,它们是。我在这里看到结构可以有大写和小写的首字母。那么,为什么 Go 模板引擎不同时渲染两者呢?
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

简而言之,模板引擎在成员以小写形式编写时无法看到成员,因为模板引擎位于与您的结构不同的另一个包中。

你可能已经注意到 Go 没有使用privateorpublic关键字来提高可见性。相反,当标识符的第一个字母为大写时,所有函数、成员、变量等都是公共的。如果标识符未导出,则它们只能在同一个包中使用。

导出标识符的规范:

可以导出标识符以允许从另一个包访问它。如果同时满足以下条件,则会导出标识符:

  • 标识符名称的第一个字符是 Unicode 大写字母(Unicode 类“Lu”);和

  • 标识符在包块中声明,或者它是字段名称或方法名称。

不导出所有其他标识符。


查看完整回答
反对 回复 2021-07-12
?
HUX布斯

TA贡献1876条经验 获得超6个赞

这是因为 Go 模板引擎使用反射从它不“知道”的类型中获取值。仅导出以大写字母开头的字段名称,因此可用于反射模型。有关导出内容和不导出内容的规则的详细信息,请参见此处:

[Where..]标识符名称的第一个字符是Unicode大写字母(Unicode类“Lu”)...

还有一些其他规定,但这是最重要的一项。


查看完整回答
反对 回复 2021-07-12
?
FFIVE

TA贡献1797条经验 获得超6个赞

小写在 Go 中意味着私有,因此模板代码不允许访问字段。


查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信