環境
作業系統:Windows 10
golang版本:go version go1.15.6 windows/amd64
編輯器:GoLand 2019.3.4
Go 命令行
windows 10可直接在 git bash執行
檢查版本
$ go version
go version go1.15.6 windows/amd64
檢查GOPATH
$ echo $GOPATH
C:\Users\user\go
build命令
http://c.biancheng.net/view/120.html go build命令(go语言编译命令)完全攻略
$ ls
hello.go
$ go build hello.go
$ ls
hello.exe* hello.go
$ ./hello.exe
Hello, 世界
30
GoLand
熱鍵(使用sublime基礎的Keymap)
走到下一個斷點:(Resume Program) => F9 (需自定義)
快速複製檔案名字 :ctrl+shift+p => Rename File
第一個golang程式
hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
fmt.Println(test(3))
}
func test(n int) int {
return n * 10
}
使用GoLand斷點
https://studygolang.com/articles/20746 使用 GoLand 进行调试的要点
https://opensource.com/article/20/6/debug-go-delve Stop debugging Go with Println and use Delve instead - 純CLI調試
ctrl + shift + p => Debug
go build hello.go => Debug然後就會自動執行,停在你之前設定斷點的地方(或是直接 Debug 'go build hello.go' )計算表達式
ctrl+shift+p => Evaluate Expression
但是不支持調用函數,如這邊直接調用test(4)方法(test(4)=4*10=40)
報錯
could not recover call injection state for goroutine x
原因
https://github.com/go-delve/delve/issues/2087 To support call in go1.15
https://github.com/go-delve/delve/issues/1710#issuecomment-604395056 Version of Delve is too old for this version of Go (maximum supported version 1.12, suppress this error with --check-go-version=false)
GoLand 2019.3.4 內置的 Delve Debugger 版本(1.4.0)太舊
位置:C:\Program Files\JetBrains\GoLand 2019.3.4\plugins\go\lib\dlv\windows\dlv.exe
解法1
升級GoLand
解法2
手動安裝最新版dlv
$ go get -u github.com/go-delve/delve/cmd/dlv
檢查dlv版本
$ dlv version
Delve Debugger
Version: 1.5.1
Build: $Id: bca418ea7ae2a4dcda985e623625da727d4525b5 $
檢查是否安裝dlv
$ go list ... | grep dlv
github.com/go-delve/delve/cmd/dlv
github.com/go-delve/delve/cmd/dlv/cmds
查dlv位置
$ which dlv
/c/Users/user/go/bin/dlv
把 C:\Users\user\go\bin\dlv.exe 複製到 C:\Program Files\JetBrains\GoLand 2019.3.4\plugins\go\lib\dlv\windows\ 下(記得把GoLand 原本舊版本的dlv先備份)
然後就可以在斷點時成功調用函數
手動命令行安裝完dlv後,會安裝到 C:\Users\user\go 下(有bin和src目錄)。GoLand就會自動抓到GOPATH
總結
GoLand的dlv斷點配置起來比PHPstorm的XDebug 簡單,但是用起來沒有那麼順手。