Go IDE vscode (by quqi99)

Posted quqi99

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go IDE vscode (by quqi99)相关的知识,希望对你有一定的参考价值。

作者:张华 发表于:2021-11-19
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
(http://blog.csdn.net/quqi99 )

go环境设置

#https://golang.org/doc/install
GO_VERSION=1.18.2
GO_ARCH=linux-amd64
curl -o go.tgz https://dl.google.com/go/go$GO_VERSION.$GO_ARCH.tar.gz
sudo rm -rf /usr/lib/go && sudo tar -C /usr/lib -xzf go.tgz
go version
sudo chown -R $USER /usr/lib/go
export GOROOT=/usr/lib/go
export GOPATH=/bak/golang
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
alias gosrc="cd $GOROOT/src"
alias gopath="cd $GOPATH"
alias gomod="cd $GOMOD"
alias gorm='gormt -g=true'
alias gotest='gotests -all -w ./'
alias goformat='gofmt -l -w -s ./'
alias goimport='goimports -l -w ./'
alias gorace='go run -race .'
alias cover="go test -coverprofile=cover.out"
alias covers="go tool cover -html=cover.out"

#GO111MODULE=on means go will ignore GOPATH and vendor to search the package, just uses go.mod
go env -w GO111MODULE=off
#go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOROOT=/usr/lib/go
go env -w GOBIN=/usr/lib/go/bin
go env -w GOPATH=/bak/golang

cd /bak/golang/src
unset GO111MODULE && go env -w GO111MODULE=on
go mod init mymods
go mod tidy
cat go.mod
go get -u golang.org/x/tools/cmd/goimports
go get -u golang.org/x/tools/cmd/gorename
go get -u github.com/sqs/goreturns
go get -u github.com/nsf/gocode
go get -u github.com/alecthomas/gometalinter
go get -u github.com/zmb3/gogetdoc
go get -u github.com/rogpeppe/godef
go get -u golang.org/x/tools/cmd/guru
go install mvdan.cc/gofumpt@latest
go get -u -v github.com/ofabry/go-callvis
go get -u -v github.com/google/gops
go get -u -v golang.org/x/tools/gopls
go get -u -v github.com/uudashr/gopkgs/v2/cmd/gopkgs
go get -u -v github.com/ramya-rao-a/go-outline
go get -u -v github.com/acroca/go-symbols
go get -u -v github.com/go-delve/delve/cmd/dlv
go get -u -v golang.org/x/lint/golint
go get -u -v github.com/cweill/gotests/...
go get -u -v github.com/fatih/gomodifytags
go get -u -v github.com/josharian/impl
go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
go get -u -v github.com/haya14busa/goplay/cmd/goplay
go get -u -v github.com/godoctor/godoctor
go get -u -v github.com/smartystreets/goconvey  
go get -u -v github.com/jstemmer/gotags
go get -u -v golang.org/x/tools/cmd/godoc
go get -u -v github.com/golangci/golangci-lint/cmd/golangci-lint
go get -u -v github.com/xxjwxc/gormt@master (gormt -g=true)
go get -u -v google.golang.org/protobuf/cmd/protoc-gen-go 
go get -u -v google.golang.org/grpc/cmd/protoc-gen-go-grpc
go get -u -v github.com/envoyproxy/protoc-gen-validate
#make up for golint's shortcomings
sudo snap install golangci-lint

之前的CLI方式

之前一直使用cscope和ctag(往前跳和往后跳仍然是Ctrl+O以及Ctrl+I)来查看go代码,

find . ! -name '*test.go' ! -path '*test*' -name '*.go' > cscope.files
cscope -Rbkq
ctags -R
find . ! -name '*test.go' ! -path '*test*' -name '*.go' |xargs -i grep --color -H 'a' 

并使用YCM (https://github.com/chxuan/vimplus.git)来做代码提示,
同时在~/.vimrc修改了cscope的快捷键, 并添加ConqueGdb用于go调试。

set colorcolumn=80                                                              
set belloff=all                                                                 
let g:ycm_server_python_interpreter = '/usr/bin/python2.7'

" ConqueGdb for go debug - https://michaelthessel.com/go-vim-debugging-with-gdb/
let g:ConqueTerm_Color = 2                                                      
let g:ConqueTerm_CloseOnEnd = 1                                                 
let g:ConqueTerm_StartMessages = 0                                              
                                                                                
function DebugSession()                                                         
    silent make -o vimgdb -gcflags "-N -l"                                      
    redraw!                                                                     
    if (filereadable("vimgdb"))                                                 
        ConqueGdb vimgdb                                                        
    else                                                                        
        echom "Couldn't find debug file"                                        
    endif                                                                       
endfunction                                                                     
function DebugSessionCleanup(term)                                              
    if (filereadable("vimgdb"))                                                 
        let ds=delete("vimgdb")                                                 
    endif                                                                       
endfunction                                                                     
call conque_term#register_function("after_close", "DebugSessionCleanup")        
nmap <leader>d :call DebugSession()<CR>;
if has("cscope")                                                                
   set cscopetag                                                                
   " set to 1 if you want the reverse search order.                             
   set csto=1                                                                   
   " add any cscope database in current directory                               
   if filereadable("cscope.out")                                                
      cs add cscope.out                                                         
   " else add the database pointed to by environment variable                   
   elseif $CSCOPE_DB !=""                                                       
      cs add $CSCOPE_DB                                                         
   endif                                                                        
                                                                                
   " show msg when any other cscope db added                                    
   set cscopeverbose                                                            
   nmap css :cs find s <C-R>=expand("<cword>")<CR><CR>                          
   nmap csg :cs find g <C-R>=expand("<cword>")<CR><CR>                          
   nmap csc :cs find c <C-R>=expand("<cword>")<CR><CR>                          
   nmap cst :cs find t <C-R>=expand("<cword>")<CR><CR>                          
   nmap cse :cs find e <C-R>=expand("<cword>")<CR><CR>                          
   nmap csf :cs find f <C-R>=expand("<cfile>")<CR><CR>                          
   nmap csi :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>                        
   nmap csd :cs find d <C-R>=expand("<cword>")<CR><CR>                          
   nmap hello :echo "hello"<CR>                                                 
endif                   

基本全部使用CLI, 调试go代码也是使用dlv CLI

现在的GUI方式

但是YCM提示go代码还是不够强大,微软的vscope作为一款GUI的IDE, 可以:

  • 应用商店搜索vim插件安装,这样让使用vscope的习惯和CLI一样。 注意:因为安装了vim插件,所以得按i才能输入字符。别忘了。
  • 搜索ai插件安装,让代码提示更智能

现在代码提示是智能了,但仍然有一个不好用的地方,就是包的自动导入。

  1. 搜索安装’auto import’插件
  2. 参考(https://medium.com/backend-habit/setting-golang-plugin-on-vscode-for-autocomplete-and-auto-import-30bf5c58138a)安装一些工具,on VsCode click View -> Command Pallete or type Ctrl+Shift+P and type goinstall update/tools.
  3. 不用在setting.json中编辑: go.autocompleteUnimportedPackages=True也能生效,注意:是不用。
  4. 一定要重启vscode,之前一直不行是因为没重启
  5. 然后保存代码时,会自动导入包。

但是这个功能非常不好用,它是它只能导入标准包,不能导入第三方包。例如对于一个rpc包,我希望导入的是/bak/golang/src/github.com/ethereum/go-ethereum/rpc/,而不是:

import "net/rpc"

按’Ctrl + shift + p"搜"Add import"手动导入包也不能将这个第三方包列出来。

网上说要在setting.json中添加下列参数,试过了,不好使。

 "go.inferGopath": true,

无解了,用得不太顺

用vscode写C

vscode可以编译单个C文件,但对于多个C文件好像不能自动编译,它只是一个编辑器不是一个IDE, 见:
https://www.cnblogs.com/shadowfish/p/12059872.html

vim-go

用cscope可以调到call它的函数处,这是它的最大优点.
但是使用cscope需要人工敲命令建索引,如果有时候只想像ctags(用于C的)来查看go语言的代码定义的话可以使用vim-go(它不需要人工建索引,方便,但是不能到call 它的函数处).
安装步骤如下:
1, 参考(https://blog.csdn.net/quqi99/article/details/122744892)安装vimplus (https://github.com/chxuan/vimplus.git)
2, vim ~/.vimrc
Plug ‘fatih/vim-go’
3, 因为使用了vimplus,所以不是使用(:PluginInstall)来安装插件,而是使用",i"来安装

安装后,好像没做什么设置自动就能使用ctrl+] 和ctrl+o返回了(和ctags的快捷键保持了一致).故下面的配置并未用到:

"go函数追踪 ctrl+] 或 gd 追踪 ctrl+o返回
autocmd FileType go nnoremap <buffer> gd :call GodefUnderCursor()<cr>
autocmd FileType go nnoremap <buffer> <C-]> :call GodefUnderCursor()<cr>
let g:godef_split=3    "追踪打开新tab
let g:godef_same_file_in_same_window=1    "函数在同一个文件中时不需要打开新窗口
"保存自动goimports
let g:go_fmt_command = "goimports"
let g:goimports = 1

以上是关于Go IDE vscode (by quqi99)的主要内容,如果未能解决你的问题,请参考以下文章

Using rust-gdb to debug rust (by quqi99)

Using rust-gdb to debug rust (by quqi99)

OVS代码结构(by quqi99)

Android学习笔记 ( by quqi99 )

什么是SSD TRIM (by quqi99)

OVS代码结构(by quqi99)