我没有看到s
定义在哪里。大师不会告诉我。我得到的只是“没有标识符的对象”,但它知道旁边的k
权利。以下是链接代码的典型代码段:
func getIndexAndRemainder(k uint64) (uint64, uint64) {
return k / s, k % s
}
一个字母的变量名称肯定会让你更难找到。我找了常见的嫌疑人:var s uint64
,s := ...
,什么都没有。显然,它需要是某个地方定义的全局值。
这给我留下了两个问题:
s
来自哪里?编辑: 对于那些偶然发现此事的人。
Guru让我失望,因为我没有在适当的Go工作区下检查包的源代码,方法是将git clone放在/ some / path / src下并将GOPATH
设置为/ some / path。因此,虽然我认为GOPATH=. guru definition s
可行,但GOPATH
被忽略了。 guru可以找到k
,因为它在文件中,但它不知道如何查看其他文件。
我的grep失败原因const
使用简单的=
而不是:=
。我将在将来打算时记住这一点。
答案 0 :(得分:5)
它在go-datastructures/bitarray/block.go
:
// s denotes the size of any element in the block array.
// For a block of uint64, s will be equal to 64
// For a block of uint32, s will be equal to 32
// and so on...
const s = uint64(unsafe.Sizeof(block(0)) * 8)
由于变量s
未在函数中定义,并且它没有以包名或别名为前缀,因此它必须是bitarray
包的全局(变量或常量)。
知道后,我浏览了文件夹go-datastructures/bitarray
中没有后缀_test
的每个文件,并查找了s
的顶级声明。
答案 1 :(得分:0)
在go-datastructures/bitarray/block.go, line #33中定义:
const s = uint64(unsafe.Sizeof(block(0)) * 8)
"现代"具有Go支持的IDE通常能够定义光标所在的符号/标识符或单击的内容。例如,在带有Atom插件的Go-plus中,您可以通过在单击时按住 CTRL 键来转到定义。
这些IDE使用godef开源工具查找定义源文件和行,您也可以直接使用它。您可以在此处找到godef文档:https://godoc.org/github.com/rogpeppe/godef
另一个工具guru也能够跟踪它的定义。古茹和godef都在Atom中工作,并且能够跳转到block.go,到s
的定义。但是使用"装甲"更容易? IDE,只需点击一下即可。
另请注意,使用grep
和模式的成功是有限的,因为变量和常量声明可以分组,以下也是有效的声明:
var (
longer = 3
s = uint64(3)
)
或者:
var (
s = someExpression
longer = 3
)
或者:
const (
p = uint64(iota)
s
x
)