在https://github.com/Workiva/go-datastructures/tree/master/bitarray中定义的's'在哪里?

时间:2017-09-12 16:19:31

标签: go go-guru

我没有看到s定义在哪里。大师不会告诉我。我得到的只是“没有标识符的对象”,但它知道旁边的k权利。以下是链接代码的典型代码段:

func getIndexAndRemainder(k uint64) (uint64, uint64) {
    return k / s, k % s
}

一个字母的变量名称肯定会让你更难找到。我找了常见的嫌疑人:var s uint64s := ...,什么都没有。显然,它需要是某个地方定义的全局值。

这给我留下了两个问题:

  1. s来自哪里?
  2. 如果不在这里问我怎么才能找到它?
  3. 编辑: 对于那些偶然发现此事的人。

    Guru让我失望,因为我没有在适当的Go工作区下检查包的源代码,方法是将git clone放在/ some / path / src下并将GOPATH设置为/ some / path。因此,虽然我认为GOPATH=. guru definition s可行,但GOPATH被忽略了。 guru可以找到k,因为它在文件中,但它不知道如何查看其他文件。

    我的grep失败原因const使用简单的=而不是:=。我将在将来打算时记住这一点。

2 个答案:

答案 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
)