Go模板中的结构变量名称

时间:2013-11-26 21:55:20

标签: go go-templates

我正在尝试使用内置的http /模板库将结构传递到Go模板。但是,我发现如果我用第一个字母小写命名结构的变量,它们不会在模板中呈现,但如果我用第一个字母大写命名它们,它们就是。我看到here结构可以有大写和小写的第一个字母。那么,为什么Go模板引擎不会同时渲染两者?

例如,请参阅:

提前致谢。

3 个答案:

答案 0 :(得分:3)

简单地说,模板引擎在以小写字母书写时无法看到成员 因为模板引擎位于另一个包而不是结构中。

您可能已经注意到Go不会使用privatepublic个关键字来查看可见性。 相反,当第一个字母时,所有函数,成员,变量等都是公共的 标识符的大小写是大写的。如果不导出标识符,则只能 可以在同一个包装中使用。

导出标识符的spec

  

可以导出标识符以允许从另一个标识符访问它   包。如果两者都导出标识符:

     
      
  • 标识符名称的第一个字符是Unicode大写字母(Unicode类“Lu”);和
  •   
  • 标识符在包块中声明,或者是字段名称或方法名称。
  •   
     

不会导出所有其他标识符。

答案 1 :(得分:1)

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

  

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

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

请参阅this post,了解有关反射如何运作的一些重要信息。

答案 2 :(得分:0)

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