Go + Visual Studio Codeの開発環境を作る


IDE大好きなのでIDE使って開発します!!
Visual Studio CodeはわりとGoが書きやすい気がするので使ってます。

## やること
- GOPATHの設定
- Visual Studio Codeの設定

## Goのインストール
GoはHomebrewでサクッとインストール

```
$ brew install go
```

バージョンは1.9.3

```
$ go version
go version go1.9.3 darwin/amd6
```

## GOPATHの設定
GOPATHはGoのワークスペースの場所指す環境変数です。

### GOPATHに設定するためのディレクトリを作る
Goをインストールしたパス以外なら、ユーザーに書き込み権限があれば場所はどこでもいい。
名前もなんでもいいので空のディレクトリを作成する。

```
$ mkdir ~/go
```

### GOPATHを環境変数に設定
`$GOPATH/bin`はGoのツール使うのに必要なのでパス通しておく

```
$ vi ~/.bash_profile
```

```.bash_profile
# golang
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$PATH
```

### 書いたらリロード
```
$ source ~/.bash_profile
```

### GOPATHに作業ディレクトリを作る
Goのコードはワークスペース内（GOPATH）で開発する必要があります。
大体GitHubを使って開発すると思うので、それを想定した構造にします。

GOPATHのsrc配下に以下のようなディレクトリを作成します。
※`my_user`とか`my_repo`の場所は自分のリポジトリに合わせて変える。

```
$ mkdir -p ~/go/src/github.com/my_user/my_repo
```

## Visual Studio Code
[Visual Studio Code](https://code.visualstudio.com/download)
ぱっとダウンロード、ぱっとインストール

### Goの拡張機能をインストール
左のアクティビティバーからGoを検索してインストール

![スクリーンショット 2018-02-09 21.46.02.png](https://qiita-image-store.s3.amazonaws.com/0/206915/760f21cc-67b6-8710-25e8-14d1cab8d168.png "スクリーンショット 2018-02-09 21.46.02.png")

この顔が目印です

![スクリーンショット 2018-02-09 21.56.55.png](https://qiita-image-store.s3.amazonaws.com/0/206915/ada0244d-0235-6f99-3c32-4fa5a2be5bb5.png "スクリーンショット 2018-02-09 21.56.55.png")

### 開発に必要な外部ライブラリをインストール

作業ディレクトリに適当なgoファイルを作成します

```
$ touch ~/go/src/github.com/my_user/my_repo/main.go
```

Visual Studio Codeを開いて先程GOPATHに作成したディレクトリを開きます

![スクリーンショット 2018-02-09 22.10.48.png](https://qiita-image-store.s3.amazonaws.com/0/206915/beb9d8bd-a194-94eb-c690-19b74c286cbd.png "スクリーンショット 2018-02-09 22.10.48.png")

touchしたmain.goが現れたらダブルクリック!!

![スクリーンショット 2018-02-09 22.32.27.png](https://qiita-image-store.s3.amazonaws.com/0/206915/4d6a61bb-bc50-3b5e-c424-3c5bc56e5ae4.png "スクリーンショット 2018-02-09 22.32.27.png")

通常は自分で必要なライブラリを`go get`してきますが、
Visual Studio CodeでGoのファイルを開くと以下の通知がでてくるので
「Install All」を押せば必要なライブラリがインストールされるので楽です!!

![スクリーンショット 2018-02-09 21.53.35.png](https://qiita-image-store.s3.amazonaws.com/0/206915/4ca9657e-68b4-2710-a5ac-c39592a7f501.png "スクリーンショット 2018-02-09 21.53.35.png")

コンソールの出力タブにはインストールしたライブラリが表示されます!!

```
Installing 9 tools at /Users/sakuraba/go/bin
  gocode
  gopkgs
  go-outline
  go-symbols
  guru
  gorename
  godef
  goreturns
  golint

Installing github.com/nsf/gocode SUCCEEDED
Installing github.com/uudashr/gopkgs/cmd/gopkgs SUCCEEDED
Installing github.com/ramya-rao-a/go-outline SUCCEEDED
Installing github.com/acroca/go-symbols SUCCEEDED
Installing golang.org/x/tools/cmd/guru SUCCEEDED
Installing golang.org/x/tools/cmd/gorename SUCCEEDED
Installing github.com/rogpeppe/godef SUCCEEDED
Installing sourcegraph.com/sqs/goreturns SUCCEEDED
Installing github.com/golang/lint/golint SUCCEEDED

All tools successfully installed. You're ready to Go :).
```

ここでインストールされたライブラリたちは
GOPATHで指定したディレクトリ配下にインストールされています

```
$ ls -la ~/go/bin/
total 107032
drwxr-xr-x  11 sakuraba  staff       352  2  9 21:59 .
drwxr-xr-x   5 sakuraba  staff       160  2  9 21:54 ..
-rwxr-xr-x   1 sakuraba  staff   3875184  2  9 21:54 go-outline
-rwxr-xr-x   1 sakuraba  staff   3689776  2  9 21:54 go-symbols
-rwxr-xr-x   1 sakuraba  staff  10555348  2  9 21:54 gocode
-rwxr-xr-x   1 sakuraba  staff   5597216  2  9 21:55 godef
-rwxr-xr-x   1 sakuraba  staff   5292736  2  9 21:59 golint
-rwxr-xr-x   1 sakuraba  staff   4448064  2  9 21:54 gopkgs
-rwxr-xr-x   1 sakuraba  staff   5551424  2  9 21:54 gorename
-rwxr-xr-x   1 sakuraba  staff   6600752  2  9 21:59 goreturns
-rwxr-xr-x   1 sakuraba  staff   8128320  2  9 21:54 guru
```

### ユーザー設定
細かいのは個人の好みだと思うので軽くMy設定を書いてみる。
個人的に黒い画面でコード書くのは好きじゃないので、IDEの見た目は白い感じにしちゃいます!

```
{
  // ミニマップを表示するかどうかを制御します
  "editor.minimap.enabled": false,
  // エディターで空白文字を表示する方法を制御します。'none'、'boundary' および 'all' が使用可能です。'boundary' オプションでは、単語間の単一スペースは表示されません。
  "editor.renderWhitespace": "all",
  // エディターで制御文字を表示する必要があるかどうかを制御します
  "editor.renderControlCharacters": true,
  // エディターがリンクを検出してクリック可能な状態にするかどうかを制御します
  "editor.links": false,

  // 有効にすると、ファイルの保存時に末尾の空白をトリミングします。
  "files.trimTrailingWhitespace": true,
  // 有効にすると、ファイルの保存時に最新の行を末尾に挿入します。
  "files.insertFinalNewline": true,

  // Include unimported packages in auto-complete suggestions.
  "go.autocompleteUnimportedPackages": true,

  // ワークベンチの色設定
  "workbench.colorTheme": "Default Light+"
}
```

これでVisual Studio CodeでGoの開発を行う準備はできました!!

## 動かす

こんな感じで補完されます。

![スクリーンショット 2018-02-09 23.10.04.png](https://qiita-image-store.s3.amazonaws.com/0/206915/a4defa9f-397b-cf43-3c75-ccee02d57198.png "スクリーンショット 2018-02-09 23.10.04.png")

### サンプルプログラム
こんな構造で

```
$ tree
.
├── main.go
└── sample
    └── sample.go
```

こんなプログラムを動かしてみました

```main.go
package main

import (
	"fmt"

	"github.com/my_account/my_repo/sample"
)

func main() {
	fmt.Print(sample.Hello())
}
```

```sample.go
package sample

// Hello ハロー
func Hello() string {
	return "Hello World!!"
}
```

ハローワールド!!

```
$ go run main.go 
Hello World!!
```