Golang勉強メモ①環境構築

# 環境
Go:1.14.2
OS:Mac
git:2.20.1 (Apple Git-117)
エディタ：VisualStudioCode

Go言語のIDEとしては、他にGolandが有名だが、
一旦はフィジ確認程度で、VisualStudioCodeで不満なく使用できそうなので
VisualStudioCodeを選択。

# Go本体のインストール
下記からApple MacOS向けの最新版(1.14.2)のモジュールをインストール。
https://golang.org/dl/
ダウンロードが完了したらインストーラーが起動するので、
画面の指示に従いインストールする。
インストール完了後、ターミナルを開き`go -version`と入力し
下記のように表示されたらインストール成功。

```
$ go version
go version go1.14.2 darwin/amd64
```

# パスの設定
`go env`コマンドでgoの環境変数の設定確認ができる。
今回、デフォルト設定でインストールしたところ、下記の通り設定されていた。

```
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/username/Library/Caches/go-build"
GOENV="/Users/username/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/username/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
・・・

```

下記のうち、特に注意が必要な変数は2つ

* GOROOT<br>Goモジュールのルートディレクトリ
インストールしたGoのパスが登録される。<br>
複数バージョンを使う以外はデフォルトのまま使用して良い。<br>
デフォルトのインストール設定では配下に`go`と`gofmt`が格納されていた。

```
$ls
go	gofmt
```


* GOPATH<br>Goのワーキングディレクトリを指す。<br>
`go get`というパッケージをダウンロードするコマンドを使用する際に必要となる。<br>
ダウンロードしたパッケージはGOPATHで指定したディレクトリに保存され、
goでimportする際にはGOPATHの中身を参照しに行く。<br>
デフォルトのインストールでパスが通っていたが、該当のフォルダは作成されていなかった。<br>

# gitのインストール
（まだgitを導入していない場合）
ターミナルで`git`と入力すると、install commandline developer toolsの
ポップアップが表示されるので、インストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298390/3c704d78-2850-5f3a-a864-39813fa3c3df.png)

インストール終了後、ターミナル上で`git --version`と入力し、
バージョン情報が出力されたらインストール完了。

```
$ git --version
git version 2.20.1 (Apple Git-117)
```


# VisualStudioCodeのインストール
上記リンクからソフトをダウンロードする。（Stable Build版）
https://code.visualstudio.com/

ダウンロードしたzipを解凍し、解凍後に
ダウンロードディレクトリからアプリケーションのディレクトリに移動させる。
（Launchpadからの起動が可能になる。）

# VisualStudioCodeの設定
* 日本語化<br>なんにでも使える
https://qiita.com/ntkgcj/items/e77331932c7983dea830
* Golang拡張機能のインストール<br>予測変換などが可能に
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298390/afc714c4-e1e5-c637-964d-c921e2667b10.png)

* パッケージのインストール、更新
※上記gitのインストール、golangの拡張機能のインストール後実施すること
VSCode上で`⌘command+Shift+P`でコマンドパレットを開き、
`>go:install/update tools`と入力する。
必要なパッケージを選択後、インストールする。（基本的にすべて選択で良い）
<img width="762" alt="スクリーンショット 2020-05-07 18.54.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298390/046bd1b5-3a50-4437-48c5-b6c075a863cc.png">

インストールが正常に終了すると、下記のように表示される。
何かしらに失敗していたらgitコマンドが有効になっているか確かめる。

```
  gocode
  gopkgs
  go-outline
  go-symbols
  guru
  gorename
  gotests
  gomodifytags
  impl
  fillstruct
  goplay
  godoctor
  dlv
  gocode-gomod
  godef
  goreturns
  golint

Installing github.com/mdempsky/gocode SUCCEEDED
Installing github.com/uudashr/gopkgs/v2/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/cweill/gotests/... SUCCEEDED
Installing github.com/fatih/gomodifytags SUCCEEDED
Installing github.com/josharian/impl SUCCEEDED
Installing github.com/davidrjenni/reftools/cmd/fillstruct SUCCEEDED
Installing github.com/haya14busa/goplay/cmd/goplay SUCCEEDED
Installing github.com/godoctor/godoctor SUCCEEDED
Installing github.com/go-delve/delve/cmd/dlv SUCCEEDED
Installing github.com/stamblerre/gocode SUCCEEDED
Installing github.com/rogpeppe/godef SUCCEEDED
Installing github.com/sqs/goreturns SUCCEEDED
Installing golang.org/x/lint/golint SUCCEEDED

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

なお、ダウンロードした拡張機能は先程確認したGOPATH配下に格納される。

```
$ls
dlv		gocode		golint		gorename	impl
fillstruct	gocode-gomod	gomodifytags	goreturns
go-outline	godef		gopkgs		gotests
go-symbols	godoctor	goplay		guru
```

# goのテストプログラム
`gogo.go`という名称で、以下のコードを作成。

```
package test

import (
	"fmt"
)

func main() {
	fmt.Println("gogo!golang!!")
}
```

コードを簡単に解説

* pakage<br>
名前空間を分ける仕組み。<br>
ソースファイルは1つのpackageに属する必要がある。<br>
なお、packageを省いた状態で、goファイルを保存すると勝手にmain packageを作成してくれる。
* import<br>
importすることで外部のパッケージを使用することができる。<br>
`fmt`は基本的なI/O機能を提供するパッケージ。
* func<br>
goの関数はfuncで定義を行う。<br>
ソースファイル実行時に、main関数が実行される。<br>

goファイル実行時には
`go run ファイル名`をターミナルに打ち込む。

```
go run /Users/username/golang/gogo.go
gogo!golang!!
```