2020年12月24日 星期四

golang心得

環境

作業系統: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/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 簡單,但是用起來沒有那麼順手。





沒有留言:

張貼留言