Golang開發必備: 打造MacOS下開發環境

學習一門編程語言除了學習它的語法,也要搭建一個正確好用的開發環境,這篇文章分享一下個人Golang開發環境。git

安裝Golang

在MacOS下我通常都是用Homebrew:github

❯ brew update
❯ brew install golang
❯ go version  # 安裝完成了
go version go1.12.6 darwin/amd64
複製代碼

Go環境變量配置

安裝以後要作一點環境變量配置。golang

GOPATH

GOPATH環境變量表示Go的工做目錄,這個目錄指定了須要從哪一個地方尋找GO的包、可執行程序等。用go get下載的包都放在這個目錄下。macos

從Go 1.8開始,GOPATH默認是$HOME/go,若是你但願使用其餘目錄能夠在你用的Shell配置文件(如~/.zshrc、~/.bashrc、.bash_profile)裏面指定,我推薦顯示的指定GOPATH,哪怕用了默認的目錄編程

GOROOT

GOROOT指Go語言編譯、工具、標準庫等的安裝路徑。json

從Go 1.0開始,也沒必要顯示地設置GOROOT環境變量。一般這個路徑是/usr/local/go,當使用Homebrew安裝Golang時目錄會放在"$(brew --prefix golang)/libexec"這個目錄下。瀏覽器

小結

個人.zshrc裏面是這樣配置的:bash

export GOPATH="${HOME}/.go"  # 個人我的習慣
export GOROOT="$(brew --prefix golang)/libexec"  # 默認路徑
export PATH="$PATH:${GOPATH}/bin:${GOROOT}/bin"
複製代碼

IDE

如今有很是多成熟的集成開發環境(IDE),如Emacs、GoLand、VS Code、Vim、LiteIDE等。它們都是跨平臺的,支持代碼語法高亮、自動補全、錯誤檢查、代碼引用查詢與跳轉、格式化和調試等特性,能夠做爲Golang程序開發工具。微信

其實選擇哪一個IDE沒有標準答案,看你的習慣和喜愛,若是你願意花時間去深刻和琢磨一套屬於本身的用法和快捷鍵,上面提到的任何一個 IDE 均可以幫助你完成開發。oracle

我平常用的編輯器是VS Code,因此開發環境都是基於VS Code搞的。

安裝VS Code

官網下載對應平臺安裝文件安裝就能夠了。

接着安裝官方擴展Go for Visual Studio Code,瀏覽器訪問後直接點擊install按鈕便可自動打開VS Code安裝之。

安裝必要的包

接着須要安裝一些必要的包。

若是你在VS Code(下文簡稱Code)裏面打開(新建)一個go程序文件,右下角會有相似這樣的提示:

The "go-outline" command is not available. Use "go get -v github.com/ramya-rao-a/go-outline" to install.`
複製代碼

而後是2個按鈕InstallInstall All,由於這樣的相關包還不少,一般能夠直接選擇Install All,可是因爲某些包被不明緣由限制訪問,最後會超時失敗,錯誤信息差很少是這樣的:

Installing 1 tool at /Users/xiaoxi/bin
  go-outline

Installing github.com/mdempsky/gocode FAILED
Installing github.com/ramya-rao-a/go-outline FAILED

1 tools failed to install.

go-outline:
Error: Command failed: /Users/xiaoxi/opt/go/libexec/bin/go get -u -v github.com/ramya-rao-a/go-outline
github.com/ramya-rao-a/go-outline (download)
Fetching https://golang.org/x/tools/go/buildutil?go-get=1
https fetch failed: Get https://golang.org/x/tools/go/buildutil?go-get=1: dial tcp 216.239.37.1:443: i/o timeout
golang.org/x/tools (download)
# cd /Users/xiaoxi/src/golang.org/x/tools; git pull --ff-only
fatal: unable to access 'https://go.googlesource.com/tools/': Failed to connect to go.googlesource.com port 443: Operation timed out
package golang.org/x/tools/go/buildutil: exit status 1
...
複製代碼

這時候須要在Code裏面設置代理(Proxy),爲了讓你們知道都安裝了那些包,另外我通常喜歡在命令行下執行,因此在終端能夠這樣安裝:

export http_proxy=http://10.8.0.1:8118;export https_proxy=http://10.8.0.1:8118;  # 設置代理,這裏你能夠替換成你本身的代理

go get -u -v github.com/mdempsky/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v golang.org/x/tools/cmd/goimports
go get -u -v github.com/uudashr/gopkgs/cmd/gopkgs
go get -u -v github.com/golangci/golangci-lint/cmd/golangci-lint
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/zmb3/gogetdoc
go get -u -v github.com/fatih/gomodifytags
go get -u -v github.com/cweill/gotests/...
go get -u -v github.com/josharian/impl
go get -u -v github.com/uudashr/gopkgs/cmd/gopkgs
go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
複製代碼

一眼看去好多包啊。我來分別介紹一下它們是用來作什麼的:

  1. gocode。代碼補全,注意,網上有不少文章用的是https://github.com/nsf/gocode,這是錯誤的,由於nsf/gocode如今已經不維護了。
  2. godef。跳轉到代碼對應定義的,這個能夠說是各類編程語言IDE必備的功能。
  3. guru。guru原來叫作oracle,能得到所有代碼對應引用
  4. gorename。重命名Go源碼文件
  5. goimports。自動幫你格式化import語句的,它來幫你決定import順序
  6. gopkgs。列出Go包。
  7. golangci-lint。舊的用法是gometalinter,如今應該選擇快5倍的golangci-lint,這個工具用來作靜態檢查工具,它會反饋代碼風格並給出建議,這樣就能夠在源碼保存是運行它能告訴你現有代碼中有什麼問題
  8. go-outline。當前文件作符號(Symbol)搜索,至關於文件大綱
  9. go-symbols。工做區符號搜索
  10. gogetdoc。鼠標懸停時能夠顯示文檔(方法和類的簽名等幫助信息)
  11. gomodifytags。提供tags管理,能夠對struct的tag增刪改
  12. gotests。用例測試
  13. impl。自動生成接口實現代碼(stubs)
  14. gopkgs。導入包時自動補全(列出可導入的包列表,主要用於包導入時的提示功能)
  15. fillstruct。根據結構體定義在使用時自動填充默認值

更多信息能夠看延伸閱讀連接1。注意有些包我沒有安裝,如golint、gometalinter、goreturns等,由於在對應場景下使用了其餘包,就不必裝了(你們不要直接粘貼我或者其餘開發者安裝的包列表,有本身的思考選擇性的安裝)

另外這些包其實不止針對於Code,對於其餘編輯器也是適用的,你能夠根據包名搜索有沒有對應編輯器的擴展或者插件,大部分均可以集成進去。

配置VS Code

安裝以後須要對Code作一些設置。首先使用快捷鍵Command+,打開設置頁面(用IDE必定要學好快捷鍵),搜索Go configuration就能夠看到Golang語言相關設置項了。不一樣的設置項類型不一樣:有下拉菜單、單選框、Input框,設置須要直接編輯配置文件settings.json。

Code給每一項都設置了默認值,settings.json文件裏面的設置會覆蓋默認的,你能夠直接編輯settings.json文件,也能夠在設置頁面對設置項作選擇(如打勾、從下拉菜單選擇你要的選項、在輸入框輸入對應值等)。我通常直接修改settings.json文件,這樣換一臺電腦這些配置項能夠直接拷貝過去就可用了。下面是個人設置項,都帶了說明:

{{< highlight json >}} { "go.docsTool": "gogetdoc", // 使用gogetdoc獲取方法和類的簽名幫助信息 "workbench.colorTheme": "Dracula", // 換成我喜歡的主題 "go.formatTool": "goimports", // 指定代碼格式化工具,其餘的如gofmt goreturns goformat "go.autocompleteUnimportedPackages": true, // 未完成的包會自動補全 "go.inferGopath": true, // 讓編輯器自動推斷 GOPATH(包含全局的GOPATH,並沿着當前文件向上找到src目錄) "go.useCodeSnippetsOnFunctionSuggest": true, // 使用代碼片斷提示,一會會繼續說Snippets "go.useCodeSnippetsOnFunctionSuggestWithoutType": true, "go.lintTool": "golangci-lint", // 代碼靜態檢查工具,其餘的如gometalinter golint revive staticcheck "go.gotoSymbol.includeGoroot": true, // 在工做空間進行符號搜索文件時(Shift+cOMMAND+O, #開頭)包含位於GOROOT裏面的標準庫 }

PS: 在MacOS下配置文件的路徑是`$HOME/Library/Application Support/Code/User/settings.json`。

有一點要說明,我以前也在網上看過別人的配置,發現不少項的鍵值其實如今都已經再也不可用了。怎麼知道可用選項、設置說明、可選項等信息呢?

答案是: 看官方vscode-go項目下的package.json文件(延伸閱讀連接3),都在那裏面。舉個`go.formatTool`的例子:

{{< highlight json >}}
    ...
    "go.formatTool": {
      "type": "string",
      "default": "goreturns",
      "description": "Pick 'gofmt', 'goimports', 'goreturns' or 'goformat' to run on format. Not applicable when using the language server. Choosing 'goimport' or 'goreturns' will add missing imports and remove unused imports.",
      "scope": "resource",
      "enum": [
        "gofmt",
        "goimports",
        "goreturns",
        "goformat"
      ]
    },
    ...
複製代碼

直接在文件裏面搜很方便,特別適合我這種喜歡在終端打開文件的開發者。

使用Snippets(代碼片斷)

Code中添加Snippet能夠提升寫代碼的效率,就是用別人寫好的代碼片斷實現一些功能。在前面裝的官方擴展「Go for Visual Studio Code」裏面就帶了不少代碼片斷。舉個例子,若是想寫一個for range語句,你只須要在編輯文件是打入forr,而後按Tab,就會出現這樣的一段代碼:

for _, var := range var {

}
複製代碼

而且把遊標定位到循環裏面,很是方便。所有的代碼片斷能夠看延伸閱讀連接5

另外Code市場有專門的Go Snippets插件,裏面也有不少片斷。

固然能夠自定義代碼片斷,能夠把你平常經常使用的一些代碼作成代碼片斷,首先使用Shift + Command + P調出命令窗口,輸入「snippets」,選擇 「Preferences: Open User Snippets」,而後選擇須要添加Snippet的語言(對咱們來講就是選 go.json),go.json默認是一個包含詳細註釋的例子,按它的格式寫就能夠。我這裏舉個例子:

{
    "println":{
        "prefix": "pln",
        "body":"fmt.Println($0)",
        "description": "Snippet for Println"
    },
    "printf":{
        "prefix": "plf",
        "body": "fmt.Printf(\"$0\")",
        "description": "Snippet for Printf"
    }
}
複製代碼

這樣寫代碼時用pln再按Tab就能打出對應的fmt.Println。固然這只是舉個栗子,這種經常使用的代碼在vscode-go項目中都有(分別是fpff)

PS: 使用Snippets最重要的是要記住各類縮寫前綴(如前面的forr、pln),寫起來代碼來飛快~

後記

原文地址: strconv.com/posts/setup…

好啦,就先說到這裏,之後有其餘的設置和用法我再更新~

請關注微信公衆號『Golang之美』

延伸閱讀

  1. github.com/Microsoft/v…
  2. code.visualstudio.com/docs/getsta…
  3. github.com/microsoft/v…
  4. code.visualstudio.com/docs/langua…
  5. github.com/microsoft/v…
相關文章
相關標籤/搜索