首页 > 解决方案 > 如果没有类似 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我实际上觉得它已经很难遵循foobar即使在这种情况下也是如此。

标签: go

解决方案


您使用的是没有 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将输出额外的信息,例如构建的包。这可能会帮助您进行搜索。


推荐阅读