Mac vscode配置golang開發環境

本文適用于go version go1.15.2 darwin/amd64

下載 Go

因為Mac可以使用Homebrew來安裝Go,所以直接執行以下命令來安裝Go:

brew install go

此時可能會卡在Updating Homebrew,可以通過切換中科大源來解決:

// 替換brew.git:
cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git

// 替換homebrew-core.git:
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git

然后就可以順利安裝了。安裝完成后,可以在終端執行以下命令來測試:

go version

此時會在終端顯示go版本:

image.png

Go環境變量配置

在Go 1.13之后,無需再通過設置系統環境變量的方式來修改,可以通過go env -w 命令來設置Go的環境變量。
需要設置的環境變量如下:

// 用于存放依賴包以及編譯文件,比較隨意,只要不和GOROOT重名即可,官方禁止這一行為
go env -w GOPATH=/Users/系統用戶名/Library/go
// 設置代理后,在未翻墻的情況下,打開vscode后gopls工具的加載會很快
go env -w GOPROXY=https://goproxy.cn,direct

Vscode插件安裝

在插件商店中搜索Go,并點擊安裝即可:


在這里插入圖片描述

安裝delve

Devle是一個非常棒的golang 調試工具,支持多種調試方式,直接運行調試,或者attach到一個正在運行中的golang程序,進行調試。
線上golang服務出現問題時,Devle是必不少的在線調試工具,如果使用docker,也可以把Devle打進docker鏡像里,調試代碼。
在命令終端terminate中執行以下安裝命令,進行delve的安裝。
$ go get -u github.com/go-delve/delve/cmd/dlv

設置 launch.json 配置文件

command + shift + p 調出下拉列表,輸入或者選擇 Debug: Open launch.json,打開 launch.json 文件,如果第一次打開,會新建一個配置文件,默認配置內容如下

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "env": {},
            "args": []
        }
    ]
}

可能用到的屬性介紹

啟動配置必須具有的屬性

每個啟動配置都必須具有以下屬性:
type - 用于此啟動配置的調試器的類型,如python,go,Java等。每安裝調試擴展引入一個類型:node用于內置節點調試器,例如,或php與go對PHP和去擴展。
request - 此啟動配置的請求類型。目前,launch并且attach受到支持。
name - 閱讀器友好名稱,顯示在“調試啟動配置”下拉列表中。

可選屬性

以下是可用于所有啟動配置的一些可選屬性:

preLaunchTask- 要在調試會話開始之前啟動任務,請將此屬性設置為tasks.json中指定的任務的名稱(在工作空間的.vscode文件夾中)。
postDebugTask- 要在調試會話的最后啟動任務,請將此屬性設置為tasks.json中指定的任務的名稱(在工作空間的.vscode文件夾中)。
internalConsoleOptions - 此屬性控制調試會話期間“調試控制臺”面板的可見性。
debugServer- 僅適用于調試擴展作者:此屬性允許您連接到指定的端口,而不是啟動調試適配器。

常用到的一些屬性

許多調試器支持以下某些屬性:

 program - 啟動調試器時要運行的可執行文件或文件
 args - 傳遞給程序進行調試的參數
 env- 環境變量(該值null可用于“取消定義”變量)
 cwd - 當前工作目錄,用于查找依賴項和其他文件
 port - 連接到正在運行的進程時的端口
 stopOnEntry - 程序啟動時立即中斷
 console-要使用什么樣的主機,例如internalConsole,integratedTerminal或externalTerminal

常見屬性如下

name    調試界面下拉選擇項的名稱(在最上面的DEBUG和設置按鈕中間)
type    設置為go無需改動,是 vs code 用于計算調試代碼需要用哪個擴展
mode    可以設置為 auto, debug, remote, test, exec 中的一個
program 調試程序的路徑(絕對路徑)
env 調試時使用的環境變量。例如:{ "ENVNAME": "ENVVALUE" , "go.gopath":"/Users/xx/go/src/xxx/項go項目名/cmd/http/main.go"},    // 調試時使用的環境變量。例如:{ "ENVNAME": "ENVVALUE" },gopath要指向本次要調試項目的主入口,即main.go所在的絕對路徑
envFile 包含環境變量文件的絕對路徑,在 env 中設置的屬性會覆蓋 envFile 中的配置
args    傳給正在調試程序命令行參數數組
showLog 布爾值,是否將調試信息輸出
logOutput   配置調試輸出的組件(debugger, gdbwire, lldbout, debuglineerr, rpc),使用,分隔, showLog 設置為 true 時,此項配置生效
buildFlags  構建 go 程序時傳給 go 編譯器的標志
remotePath  遠程調試程序的絕對路徑,當 mode 設置為 remote 時有效
在 debug 配置中使用 VS Code 變量
${workspaceFolder} 調試 VS Code 打開工作空間的根目錄下的所有文件
${file} 調試當前文件
${fileDirname} 調試當前文件所在目錄下的所有文件
使用構建標記(build tags)
如果需要使用構建標記(e.g. go build -tags=whatever_tag)在參數 buildFlags 里寫入 -tags=whatever_tag" 即可,支持多標簽,使用單引號將標簽包圍,例如: "-tags='first_tag second_tag third_tag'"

debug 配置代碼片段

可以在 launch.json 文件中,使用 Go 關鍵詞調出 debug 配置項的代碼片段。

調試當前文件配置片段

{
    "name": "Launch file",
    "type": "go",
    "request": "launch",
    "mode": "auto",
    "program": "${file}"
}

調試單個測試用例配置片段

{
    "name": "Launch test function",
    "type": "go",
    "request": "launch",
    "mode": "test",
    "program": "${workspaceFolder}",
    "args": [
        "-test.run",
        "MyTestFunction"
    ]
}

調試包中所有的測試用例配置片段

{
    "name": "Launch test package",
    "type": "go",
    "request": "launch",
    "mode": "test",
    "program": "${workspaceFolder}"
}

調試構建二進制文件配置片段

{
    "name": "Launch executable",
    "type": "go",
    "request": "launch",
    "mode": "exec",
    "program": "absolute-path-to-the-executable"
}

遠程調試

遠程調試需要在launch.json中將模式設置為遠程"mode":“remote”,并且還需要服務器上起一個無頭的 Delve 服務
例如:

$ dlv debug --headless --listen=:2345 --log --api-version=2

如果需要傳參數到程序中,則需要將參數傳入到 Delve 服務中
例如:

dlv debug --headless --listen=:2345 --log -- -myArg=123

launch.json 配置如下:

{
    "name": "Launch remote",
    "type": "go",
    "request": "launch",
    "mode": "remote",
    "remotePath": "服務器調試文件的目錄(絕對路徑)",
    "port": 2345,
    "host": "127.0.0.1",
    "program": "本地調試文件所在的目錄(絕對路徑)",
    "env": {}
}

將上述配置中的 host 和 port 修改 成Delve 服務所在的服務器ip和其監聽的端口號。
remotePath 應該配置為調試文件的絕對路徑
program 需要配置本地機器文件所在的絕對路徑,是 remotePath 的一個副本
配置完成后,點擊調試按鈕,VS Code 將會向遠程的 dlv 服務發出調試指令,而不是使用本機的 dlv 實例。

調試過程

在要進行調試的自定義函數或者自定義變量處,設置斷點,斷點的數目可以設置多個(注意,不要在開源的包中實現的方法處打斷點,要不然調用棧會一直深入到開源實現的底層函數/變量處)。然后 Fn + F10(step over)進行單步調試(單步調試會跳過本次不執行的分支),左邊欄中的VARIABLES變量中可以看到各個變量值的變化。如果想要進入到當前調試行中的函數里面,可以使用Fn + F11(step into)調入函數,不再想要執行函數內的語句,則可以 Fn + Shift+F11 (Step out ) 直接跳出當前函數,跳到上一次進入處的下一條語句。

注意:盡管在launch.json中定義了主函數main.go的絕對路徑,但是在調試時,仍然想要先打開main.go程序,然后在啟動調試Fn + F5后,跳轉到要調試的程序處,接著可以選擇單步調試Fn + F10或者進入函數Fn + F11,跳出函數Fn + shift + F11。通常,如果斷點處又調用了其他自定義的函數,可以在分別在這個調用函數處和函數定義內部的其他函數調用/變量處打上多個斷點,接著進行調試。

參考

https://code.visualstudio.com/Docs/editor/debugging
https://juejin.im/entry/5aa1f98d6fb9a028c522c84b
https://segmentfault.com/a/1190000018671207
https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Code#sample-configuration-to-debug-a-single-test
https://github.com/go-delve/delve/tree/master/Documentation/installation

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容