1

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.

Sean Perry
  • 3,776
  • 1
  • 19
  • 31

2 Answers2

5

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.

Jean Hominal
  • 16,518
  • 5
  • 56
  • 90
  • Thanks. I missed the "const s" in my search and forgot that `const` does not use ':=' so my grep did not find it. – Sean Perry Sep 12 '17 at 16:36
  • I also discovered that GOPATH insists on having dir/{src,bin} and the code in question has to be under src/. So while i was setting GOPATH to look in the current directory I was being ignored. Once I fixed this guru was also able to find the location. Grumble. – Sean Perry Sep 12 '17 at 16:37
  • By the way, `:=` does not work outside functions - cf. [the language specification](https://golang.org/ref/spec#Short_variable_declarations): "Short variable declarations may appear only inside functions." – Jean Hominal Sep 12 '17 at 16:38
0

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 CTRL 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
)
icza
  • 389,944
  • 63
  • 907
  • 827
  • I mentioned guru in my question and that it was not working. If it worked for you then you could have pointed out that my GOPATH was probably wrong. – Sean Perry Sep 12 '17 at 16:49
  • @SeanPerry I didn't know why it didn't work for you, I just tried it with Atom and it worked, so all I implied was that with proper arguments it is capable of answering your question. – icza Sep 12 '17 at 17:22