Go是否支持自动导出未导出名称或自动修正标识符大小写错误?
问题解答
Go是否具备自动导出未导出名称的特性
Go完全没有这类特性。Go的标识符可见性是语法层面的强制规则:只有首字母大写的类型、字段、方法、变量、常量属于导出标识符,支持跨包访问;首字母小写的标识符为包私有,仅能在定义它的包内部使用。
该规则没有任何可隐式绕过的开关,也不存在自动将小写标识符转为大写导出的机制,该设计的核心目的是强制开发者显式声明对外暴露的公共API,避免内部实现细节被意外对外暴露。
能否让go build工具批量完成这类修改
go build本身是纯编译工具,仅负责代码校验、编译、链接生成二进制产物,没有任何修改源码的能力,无法完成批量修改操作。
你可以使用Go官方工具链自带的其他工具快速批量完成这类修改:
- 最简便的方式是使用
gofmt的重写功能,执行如下命令即可递归修改当前目录下所有Go文件中对应的标识符:
其中gofmt -w -r 'foo.thing -> foo.Thing' ./...-w参数表示直接写入修改到原文件,-r后接自定义的重写规则,./...表示递归遍历当前目录下所有Go源码文件。 - 如果需要处理大量不同的标识符重写需求,还可以使用
gorename工具,它会自动识别标识符的作用域,不会误改其他上下文里的同名不相关标识符。
注意:修改前请先确认你要访问的
Thing字段/方法确实已经在定义Foo类型的包中被声明为首字母大写的导出形态,避免修改调用方代码后仍然无法访问。
内容的提问来源于stack exchange,提问作者Andrew Arrow
相关产品推荐
相关产品推荐

