VSCODE中godef無法跳轉到定義的問題

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

原文連結: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

如果遇到同樣問題的同學不妨試一試以上方式,至少對於我來說,問題得到瞭解決。
也希望作者能儘快修複這個問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.