Go勉強(1)　mac＋VSCode＋Go環境を設定

# シリーズ
[Go勉強(1)　mac＋VSCode＋Go環境を設定](https://qiita.com/oruharo/items/545378eae5c707f717ed)
[Go勉強(2)　kubernetes client-goのexamplesをbuildする](https://qiita.com/oruharo/items/261d065340845149b4ce)
[Go勉強(3)　kubernetes client-goのexamplesを読んでみる](https://qiita.com/oruharo/items/8f98e75264b9d6c7df2a)
[Go勉強(4)　kubernetes client-goでPodのwatcher（TUI）を書いてみる]
(https://qiita.com/oruharo/items/668d708cead0ad261346)
[Go勉強(5)　kubernetes client-goでPodのwatcher（TUI）を書いてみる2]
(https://qiita.com/oruharo/items/b7a131bf3eda36dd08a3)

#変更履歴
- 2019-10-24　VSCodeで候補表示が遅いため、`gocode/gocode-gomod`を`gopls`に変更。

#はじめに

Goの勉強を始めます。まずは環境準備です。

|前提環境|                            |
|----------------|----------------------------|
| OS             |macOS Mojava １０.１４.６        |
| インストール済ソフト |Homebrew、Visual Studio Code |
■参考
・[Install the Go tools(本家)](https://golang.org/doc/install#install) 
・[初めてのGo](http://gihyo.jp/dev/feature/01/go_4beginners)
・[他言語から来た人がGoを使い始めてすぐハマったこととその答え](https://qiita.com/mumoshu/items/0d2f2a13c6e9fc8da2a4)

#Goのイントール から hello world

GOPATHは`$HOME/go`となります。
※あえて設定しないことでGOPATHは`$HOME/go`と見なされます（Go1.8以降の仕様）。

```sh
＄ brew install go
     :
$ go version
go version go1.13.1 darwin/amd64
$ mkdir -p $HOME/go/src/hello
$ cd $HOME/go/src/hello
$ cat << EOF > hello.go 
package main
import "fmt"
func main() {
	fmt.Printf("hello, world\n")
}
EOF
$ go build
$ ./hello
hello, world
```
#vscodeにGoの拡張機能追加
マーケットプレースから`Go for Visual Studio Code`を追加。
<img width="1288" alt="スクリーンショット 2019-10-05 18.01.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124599/a4133f80-ea77-45f9-f813-a369563e9d40.png">
詳細タブの`How to use this extension?`を参考に以下の設定を行ます。

#[Go tools that the Go extension depends on](https://github.com/Microsoft/vscode-go/wiki/Go-tools-that-the-Go-extension-depends-on)を追加
コマンドパレット`ctrl+shift+P`から`Go:Install/Update Tools`を選択。
`gocode`と`gocode-modules`以外を選択して`OK`を押下。
<img width="734" alt="スクリーンショット 2019-10-06 8.34.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124599/49ff9a6f-4187-14e7-d161-b7bef0231127.png">
<img width="722" alt="スクリーンショット 2019-10-24 7.13.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124599/c950bde1-11ab-5174-06a0-1c8c474e0015.png">

- インストールしなかった`gocode`、`gocode-modules`はModules対応が不十分なのかgo.modの状態によって候補表示がされなかったり、候補表示が遅かったりします("."を押してから5秒くらい）。 代わりに`gopls`を使います。
- 既にインストールしている場合は、＄HOME/go/binから`gocode`、`gocode-modules`を削除します。

### `gopls`を追加
ターミナルから`gopls`をインストール。
参考：[gopls User Guide](https://github.com/golang/tools/blob/master/gopls/doc/user.md)

```console
$ export GO111MODULE=on
$ go get golang.org/x/tools/gopls@latest
go: finding golang.org/x/tools latest
go: downloading golang.org/x/tools v0.0.0-20191024074452-7defa796fec0
go: extracting golang.org/x/tools v0.0.0-20191024074452-7defa796fec0
```
Go 1.13.以降は`GO111MODULE=on`は不要になったと思いますが、これを設定しないと上記の`go get`がエラーになるようです。

[gopls VSCode](https://github.com/golang/tools/blob/master/gopls/doc/vscode.md)を参考にVSCodeの設定ファイルに以下の設定を追加。

```settings.json
{
        :
    "go.useLanguageServer": true,
    "[go]": {
        "editor.snippetSuggestions": "none",
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
            "source.organizeImports": true,
        }
    },
    "gopls": {
        "usePlaceholders": true, // add parameter placeholders when completing a function

        // Experimental settings
        "completeUnimported": true, // autocomplete unimported packages
        "watchFileChanges": true,  // watch file changes outside of the editor
        "deepCompletion": true,     // enable deep completion
    },
    "go.toolsEnvVars": {
        "GO111MODULE": "on",
     },
}
```
ここでも`GO111MODULE：on`が設定されてないとVSCodeでGoソースを開いた時にimport文のところにエラーが出ます。 また、候補表示がされません。
参考：[x/tools/gopls: could not import github.com/google/trillian](https://github.com/golang/go/issues/32903)

完了すると`$HOME/go/`に`bin`と`pkg`フォルダができて上で選択したものが格納されます。
<img width="159" alt="スクリーンショット 2019-10-24 23.17.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124599/b8f98991-7de4-85ba-b8c6-d2016bec69c0.png">


#おわりに
とりあえずプログラミングの準備ができました。