Hi,
I am still quite inexperienced in go programming, and I find it quite 
frustrating, sometimes, to find what will actually be executed by a call to 
an interface method found in some arbitrary code.
Here I have traced the process of finding the definition of "conn.Close()" 
an instance of an interface method call. This is what I would like to have 
automatized by godef, for instance.
Is there anything like that out there that does it with one command / key 
stroke, etc, automagically ?
Godef and go-guru does not, as far as I know.

BR,
David

Here follows some anonymized code:
(please forgive me if I've made some errors, I hope you get the idea anyway)

In the file file1.go:1234 in the library lib1, I found a call:
: _ = conn.Close()
How do i figure out what happens when this line is executed?
Here is a list of steps to find it "mechanically", so to say:
1. file1.go:1234
   : func returnConn(conn lib2.Conn) {
   : _ = conn.Close()
   : }

   Using godef-jump on the Close() will just give me the interface
   declaration. I can use go-guru-implements, and get a list of
   possible implementations of Close, but how do I know which one will
   actually be used? So, let's figure out the actual type of conn.
   I use go-guru-referrers on returnConn, and choose one of the hits,
   which is file1.go:206

2. file1.go:206
   : func (r *Record) Release(foo bar.T1) error {
   : ...
   : var conn lib2.Conn
   : if conn, err = r.foo.getConn(baz); err != nil {
   : return err
   : }
   : defer returnConn(conn)
   conn gets its value from getConn, so I end up in file1.go:1074

3. file1.go:1074
   : func (foo *FOO) getConn(mu T2) (lib2.Conn, error) {
   : ...
   : conn := foo.connBax.Get()
   : ...
   : return conn, nil
   conn gets its value from Get(), so I go to file3.go:178

4. file3.go:178
   : func (p *Bax) Get() Conn {
   : ...
   : return &xooConn{x: p, xc: xc}
   I find the return value and go to its definition in file3.go:371

5. file3.go:371
   : type xooConn struct {
   : x     *Bax
   : xc    *baxConn
   : s T3
   : }
   Aaah! This is the type of conn at file1.go:1234!

6. file1.go:1234
   : _ = conn.Close()
   Now I can follow the "definition" of Close() using godef-jump, and
   end up in file1.go:30:

7. file1.go:30
   : type Conn interface {
   : Close() error

   I use go-guru-implements to see a list of possible implementations:
   : PATH1/lib2/dir1/file1.go:30.2-30.6: abstract method func 
(ConnWithTimeout).Close() error
   : PATH1/lib2/dir1/file3.go:394.23-394.27: is implemented by method 
(*xooConn).Close
   : PATH1/lib2/dir1/conn.go:304.16-304.20: is implemented by method 
(*conn).Close
   : PATH1/lib2/dir1/boo.go:12.3-45.6: is implemented by method 
(*booingConn).Close
   : PATH1/lib2/dir1/file3.go:510.21-510.25: is implemented by method 
(errorConn).Close
   : PATH1/lib2/dir1/file1.go:30.2-30.6: implements method (Conn).Close
   : PATH2/bah.go:78.9-101.2: implements method (bah.Closer).Close
   Now, since I know the type is *xooConn, I can jump to the right hit,
   and go to file3.go:394.
8. file3.go:394
   : func (ac *xooConn) Close() error {
   : pc := ac.pc
   : ...
   : return nil
   Yes, here it is, at step 8!!!!

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to