go - 如果没有类似 IDE 的特性,我们怎么知道包级变量是在哪里定义的?
问题描述
在 Go 中,“顶级”变量具有包级范围,文件在范围方面没有任何意义。没有像 python、javascript(es6) 等那样的“模块”概念。(嗯,有“go 模块”,但在这些语言中它更像是“包”,我认为这里不相关。)
如果是这样,我们如何知道在没有 IDE/编辑器帮助的情况下定义变量的位置?我觉得这就像我在管理大量的全局变量。例如:
// foo.go
package main
var foo = "foo"
// bar.go
package main
var bar = "bar"
// main.go
package main
import "fmt"
func main() {
fmt.Println(foo, bar)
}
在这里,如果我无法使用今天的丰富编辑器功能并且项目有庞大的代码库,我们如何知道来自哪里foo
和来自哪里?bar
我实际上觉得它已经很难遵循foo
,bar
即使在这种情况下也是如此。
解决方案
您使用的是没有 GUI 的终端吗?如果您无法访问 IDE,我所能想到的就是使用 Linux 命令,例如grep
在包文件夹内的许多文件中搜索var <variableName>
术语。
如果您有一个test
包含 100 个文件的包,并且您想知道boo
顶级包变量在哪里,请执行以下操作:
grep -nw /path/to/test/*.go -e '^var boo'
解释:
-n
输出行号-w
代表整个单词-e
是为模式
使用/*.go
而不是-r
标志来确保它仅在.go
顶级目录中的文件中搜索(也不在子包中搜索)。
警告:这假设所有文件的格式都正确gofmt
,例如所有包变量都没有缩进。如果变量不小心被空格/制表符缩进,那么你可以^
在模式中省略,但这可能也会var boo
在函数中找到局部变量。
如果一个包有太多包级变量并且包很大,那么它可能是一个问题。顶级变量就像全局变量,除非您知道该怎么做,否则最好避免使用。
顺便说一句,执行go build -v
或运行其他工具-v
将输出额外的信息,例如构建的包。这可能会帮助您进行搜索。
推荐阅读
- php - .gitignore 的官方 laravel 推荐让我对未使用的文件夹感到困惑
- ios - 参数类型“UITextField”不符合预期类型“序列”
- c# - .NET C# float.Parse 返回不同的结果到 double.Parse
- vba - Excel 按首字母过滤列以获取超过 2 个值
- django - Django - POST - 在查询集中保存多个项目
- r - Shiny R 确定选中了哪个复选框
- cocoa - 框架使用drawRect:; 我需要在支持层的 NSView 上使用它。如何更新?
- javascript - 用 javascript 恢复我的代码
- javascript - 在 Babel 和 Webpack 中使用异步等待和动态导入语句
- java - 如何以编程方式更改已登录用户的主体?