1

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

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

一个字母的变量名肯定会让 grep 变得更加困难。我一直在寻找通常的嫌疑人:var s uint64s := ...,什么都没有。显然,它需要是某个地方定义的全局值。

这给我留下了两个问题:

  1. s来自哪里?
  2. 如果不在这里问,我怎么能找到它?

编辑:对于其他偶然发现这一点的人。

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

我的 grep 失败原因const使用简单的=not a :=。以后grepping的时候我会记住这一点。

4

2 回答 2

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.

于 2017-09-12T16:28:23.867 回答
0

它在go-datastructures/bitarray/block.go 中定义,第 33 行

const s = uint64(unsafe.Sizeof(block(0)) * 8)

支持 Go 的“现代”IDE 通常能够转到光标所在的符号/标识符的定义或单击的内容。例如,在带有Go-plus插件的Atom中,您可以通过在单击时按住键来转到定义。CTRL

这些IDE使用godef开源工具查找定义源文件和行,你也可以直接使用。你可以在这里找到 godef 文档:https ://godoc.org/github.com/rogpeppe/godef

另一个工具guru也能够跟踪它的定义。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
)
于 2017-09-12T16:34:12.260 回答