這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
原文連結:http://targetliu.com/vscode-can-not-go-to-def/
之前研究GOLANG時一直用LiteIDE,不得不說,LiteIDE的確不錯,但是總感覺缺乏美感,是一款很中規中矩的編輯器。網上看到大家對VSCODE評價不錯,嘗試後發現的確不錯,布局簡潔、外掛程式化、支援中文,通過VSCODE GO擴充能夠很舒服的寫GO的代碼。
問題描述
不過在實際使用過程中發現 net 包無法正常跳轉到定義,如下段代碼 ResolveTCPAddr就無法正常跳轉
package mainimport ( "net")func main() { _, err := net.ResolveTCPAddr("tcp", ":4040")}
由於VSCODE GO中跳轉到定義使用的是godef,遂通過godef的debug模式查看
問題原因:
godef -debug -f main.go net.ResolveTCPAddr
運行結果如下:
2016/08/02 01:17:30 exprType tuple:false pkg: *ast.SelectorExpr net.ListenTCP [2016/08/02 01:17:30 exprType tuple:false pkg: *ast.Ident net [2016/08/02 01:17:30 exprType tuple:false pkg: *ast.ImportSpec "net" [2016/08/02 01:17:30 ] -> 0x0, Type{package "" *ast.ImportSpec "net"}2016/08/02 01:17:30 ] -> 0xc820157860, Type{package "" *ast.ImportSpec "net"}2016/08/02 01:17:30 member Type{package "" *ast.ImportSpec "net"} 'ListenTCP' {2016/08/02 01:17:30 /usr/local/go/src/net/cgo_android.go:10:8: cannot find identifier for package "C": cannot find package "C" in any of: /usr/local/go/src/vendor/C (vendor tree) /usr/local/go/src/C (from $GOROOT) /Users/targetliu/dev/govendor/src/C (from $GOPATH) /Users/targetliu/dev/golang/src/C2016/08/02 01:17:30 } -> <nil>2016/08/02 01:17:30 ] -> 0x0, Type{bad "" <nil> }2016/08/02 01:17:30 exprType tuple:false pkg: *ast.SelectorExpr net.ListenTCP [2016/08/02 01:17:30 exprType tuple:false pkg: *ast.Ident net [2016/08/02 01:17:30 exprType tuple:false pkg: *ast.ImportSpec "net" [2016/08/02 01:17:30 ] -> 0x0, Type{package "" *ast.ImportSpec "net"}2016/08/02 01:17:30 ] -> 0xc820157860, Type{package "" *ast.ImportSpec "net"}2016/08/02 01:17:30 member Type{package "" *ast.ImportSpec "net"} 'ListenTCP' {2016/08/02 01:17:30 /usr/local/go/src/net/cgo_android.go:10:8: cannot find identifier for package "C": cannot find package "C" in any of: /usr/local/go/src/vendor/C (vendor tree) /usr/local/go/src/C (from $GOROOT) /Users/targetliu/dev/govendor/src/C (from $GOPATH) /Users/targetliu/dev/golang/src/C2016/08/02 01:17:30 } -> <nil>2016/08/02 01:17:30 ] -> 0x0, Type{bad "" <nil> }godef: no declaration found for net.ListenTCP
注意到這一句:
cannot find identifier for package "C": cannot find package "C" in any of:
原來是 net 包裡 import C ,然而C並不是一個具體真實存在的包,所以godef無法進行分析,導致找不到定義。
godef的GitHub上作者也發現了同樣的問題:Issue:net.LookupIP fails #41
解決方案
在godef的GitHub上看到有人提交了針對這個問題的解決方案:master - Special treatment for "C" package. #44
根據這個提交,可以嘗試使用如下方法解決:
找到並開啟godef的 go/parser/parser.go 這個檔案
在 1970行 左右添加(代碼中+號部分,可以通過搜尋定位):
if declIdent == nil { filename := p.fset.Position(path.Pos()).Filename name, err := p.pathToName(litToString(path), filepath.Dir(filename)) + if litToString(path) == "C" { + name = "C" + } if name == "" { p.error(path.Pos(), fmt.Sprintf("cannot find identifier for package %q: %v", litToString(path), err)) } else {
重新編譯godef
如果遇到同樣問題的同學不妨試一試以上方式,至少對於我來說,問題得到瞭解決。
也希望作者能儘快修複這個問題。