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

huangapple go评论69阅读模式
英文:

Where is 's' defined in https://github.com/Workiva/go-datastructures/tree/master/bitarray?

问题

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

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

这个单字母变量名确实让我很难在代码中搜索。我已经查找了通常的情况:var s uint64s := ...,但没有找到。显然,它需要在某个地方定义为全局值。

这给我留下了两个问题:

  1. s是从哪里来的?
  2. 如果不在这里询问,我该如何找到它?

编辑:
对于其他遇到这个问题的人。

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

我的grep失败是因为const使用的是简单的=而不是:=。以后在使用grep时我会记住这一点。

英文:

I do not see where s is defined. Guru will not tell me. All I get is "no object for identifier" but it knows about the k right beside it. Here is a snippet that is typical of the linked code:

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

The one letter variable name definitely makes it harder to grep around for. I have looked for the usual suspects: var s uint64, s := ..., and nothing. Clearly it needs to be a global value defined somewhere.

This leaves me with two questions:

  1. Where is s coming from?
  2. How would I find it without asking here?

EDIT:
For others who stumble on this.

Guru failed me because I did not checkout the source for the package under a proper Go workspace by placing the git clone under /some/path/src and setting the GOPATH to /some/path. So while I thought GOPATH=. guru definition s would work, the GOPATH was ignored. guru could find k because it is in the file but it did not know how to look in other files.

My grep failed cause const uses a simple = not a :=. I will remember this when grepping in the future.

答案1

得分: 5

这段代码定义在go-datastructures/bitarray/block.go文件中:

// s表示块数组中任意元素的大小。
// 对于uint64的块,s等于64
// 对于uint32的块,s等于32
// 依此类推...
const s = uint64(unsafe.Sizeof(block(0)) * 8)

由于函数中未定义变量s,并且它没有以包名或别名为前缀,所以它必须是bitarray包的全局变量或常量。

知道这一点后,我遍历了go-datastructures/bitarray文件夹中没有以_test结尾的每个文件,并寻找了s的顶层声明。

英文:

It is defined in 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)

As the variable s was not defined in the function, and it was not prefixed by a package name or alias, it had to be a global (variable or constant) of the bitarray package.

Once that was known, I went through every file in the folder go-datastructures/bitarray that was not suffixed with _test and I looked for a top-level declaration for s.

答案2

得分: 0

这是在go-datastructures/bitarray/block.go, 第33行中定义的:

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

通常具有Go支持的“现代”IDE都具有跳转到光标所在符号/标识符定义的功能。例如,在Atom中使用Go-plus插件,你可以按住<kbd>CTRL</kbd>键并单击来跳转到定义处。

这些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
)
英文:

It's defined in go-datastructures/bitarray/block.go, line #33:

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

"Modern" IDEs with Go support usually have the ability to go to the definition of a symbol / identifier your cursor is at or what you click on. For example in Atom with the Go-plus plugin you can go to the definition by holding down the <kbd>CTRL</kbd> key while clicking.

These IDEs use the godef open source tool to find the definition source file and line, you may also use it directly. You can find the godef documentation here: https://godoc.org/github.com/rogpeppe/godef

Another tool, guru is also capable of tracking the definition of it. Both guru and godef works in Atom, and were able to jump to block.go, to the definition of s. But it's much easier to use an "armored" IDE and just do a simple click.

Also note that the success of using grep and patterns is limited, as variable and constant declarations can be grouped, and the following are also valid declarations:

var (
    longer = 3
    s      = uint64(3)
)

Or:

var (
    s      = someExpression
    longer = 3
)

Or:

const (
    p = uint64(iota)
    s
    x
)

huangapple
  • 本文由 发表于 2017年9月13日 00:19:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/46181296.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定