【问题标题】:Struct Variable Names in Go TemplatesGo 模板中的结构变量名称
【发布时间】:2013-11-26 21:55:20
【问题描述】:

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

例如,请参阅:

提前致谢。

【问题讨论】:

    标签: go go-templates


    【解决方案1】:

    简单来说,小写的成员,模板引擎是看不到成员的 因为模板引擎位于您的结构之外的另一个包中。

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

    关于导出标识符的spec

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

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

    不导出所有其他标识符。

    【讨论】:

    • 太棒了。谢谢!只是希望这种区别能在更多介绍性的 Go 文献中得到体现。
    • 我不太了解介绍性文献,但golang tourpage six 上提到了这一点,总体来说还不错。
    【解决方案2】:

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

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

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

    请参阅 this post 了解有关反射如何在 Go 中工作的一些重要信息。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        • 2015-05-04
        • 1970-01-01
        • 2011-09-01
        相关资源
        最近更新 更多