godef的一个bug

godef可以打印出Go源代码中的符号,很多集成开发工具都集成了它,并且提供了Go to Definition的命令和快捷键,可以迅速的跳转到方法和变量的声明的地方,非常的方便。

比如我常用的vscode-go,就提供了这样的功能,但是目前godef有一个bug,就是不能跳转标准库net包下的方法定义,这个bug已经提交到github上: #18, 大约在6月的时候就发现了这个bug,不清楚作者为什么没有fix,事实上早有人提供了修改的pull request。这个bug产生的原因是godef没有处理好"C"库。

我在这里把修改方法记录一下,你可以手工的修改编译godef。

找到godef文件夹下的parser文件(go/parser/parser.go),在 1970行增加一个判断。

1
2
3
4
5
6
7
name, err := p.pathToName(litToString(path), filepath.Dir(filename))
if litToString(path) == "C" {
//下面三行新为修改这个bug新增加的行
if name == "" && litToString(path) == "C" {
name = "C"
}
if name == "" {

这样你的godef就可以正常工作了。

另外,如果你升级到Go1.7发现vscode代码自动完成功能不起作用的话,可以尝试在终端中执行gocode close,这个bug可以参考:441

update on 2017-03-16:
查看相关的isses: #856#496#662#440 #442 #515 #567 #459 #517 #667

#706

你可以使用gogetdoc代替godef,在配置中加上 "go.docsTool": "gogetdoc"

或者使用实验性的go-languageServer: "go.useLanguageServer": true