我正在尝试使用内置的 http/template 库将结构传递给 Go 模板。但是,我发现如果我用第一个字母小写命名结构的变量,它们不会在模板中呈现,但如果我用第一个字母大写命名它们,它们就是。我在这里看到结构可以有大写和小写的首字母。那么,为什么 Go 模板引擎不能同时渲染两者?
例如,请参阅:
提前致谢。
我正在尝试使用内置的 http/template 库将结构传递给 Go 模板。但是,我发现如果我用第一个字母小写命名结构的变量,它们不会在模板中呈现,但如果我用第一个字母大写命名它们,它们就是。我在这里看到结构可以有大写和小写的首字母。那么,为什么 Go 模板引擎不能同时渲染两者?
例如,请参阅:
提前致谢。
简而言之,当模板引擎以小写形式编写时,模板引擎无法看到成员,因为模板引擎位于您的结构之外的另一个包中。
你可能已经注意到 Go 不使用private
orpublic
关键字来提高可见性。相反,当标识符的第一个字母为大写时,所有函数、成员、变量等都是公共的。如果标识符没有被导出,它们只能在同一个包中使用。
导出标识符的规范:
可以导出标识符以允许从另一个包访问它。如果同时满足以下条件,则导出标识符:
- 标识符名称的第一个字符是 Unicode 大写字母(Unicode 类“Lu”);和
- 标识符在包块中声明,或者它是字段名或方法名。
不会导出所有其他标识符。
小写在 Go 中表示私有,因此不允许模板代码访问这些字段。