CentOS 7にyumでGoを入れてHello Worldするまで

#環境
 - macOS 10.12.6
 - MacBook pro 2016
 - VirtualBox 5.2.18
 - CentOS 7.6-1810
 - Go 1.11.4

#インストール方法
インストール方法はざっと調べると2つあります。
・`epel`リポジトリをインストールして、goを`yum`でインストールする方法
・公式から`tar`圧縮ファイルをダウンロードして解凍する方法

リポジトリについては[こちら](https://qiita.com/nooboolean/items/9754997977d90d8aa9b5)
今回は、上のyumを使ったインストール方法にしたいと思います！（単にyumが好きだから）

###`epel`リポジトリって？？
`epel`リポジトリとは、yumのインストールの際に使用するリポジトリで、CentOSの標準では用意されていないパッケージをインストールすることができるようにするためのリポジトリです（このなかにGoも入っています）。　言わば、拡張パック的な立ち位置だと思っています。一応、`epel`リポジトリはエンタープライズ向けに作られたリポジトリなので、信頼性は高めらしいです。
しかし、こちらのリポジトリでインストールできるパッケージは、基本的にバージョンが古いものが多い傾向にあります。なぜなら、エンタープライズ向けなのもあって、確実な信用がなければ組み込まないからです（たぶん）。
よって、バージョンの新しくなったものを「ほいさ！」とすぐに取り入れることはしないのだと思います。

#インストール
###epelリポジトリのインストール
まずはepelリポジトリをインストール

```
# yum install epel-release
```
これでGoをyumでインストールすることができる状態になりました。
ためしに、確認。

```
# yum info golang
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: mirror.premi.st
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
利用可能なパッケージ
名前                : golang
アーキテクチャー    : x86_64
バージョン          : 1.11.4
リリース            : 1.el7
容量                : 631 k
リポジトリー        : epel/x86_64
要約                : The Go Programming Language
URL                 : http://golang.org/
ライセンス          : BSD and Public Domain
説明                : The Go Programming Language.
```

バージョン`1.11.4`がインストールできるみたいですね！
公式の`tar`圧縮ファイルでは、1.11.5が最新みたいなので、あまり差異はないみたいです。
###Goをインストール
```
# yum install -y golang
```
`完了しました！`が出れば終了。
入ってるかの確認。

```
# go version
go version go1.11.4 linux/amd64
```
1.11.4が入ってる！

#$GOPATHの設定
Goを動かすには、環境変数$GOPATHを設定しなくてはなりません。

>Go言語では、環境変数GOPATHに保存されたパス（以降、単にGOPATHと呼びます）を開発時の作業ディレクトリとして扱います。 GOPATHを利用することで、外部ライブラリの導入やビルド作業を非常に簡単に行うことができます。

[こちら](http://cuto.unirita.co.jp/gostudy/post/gopath/)より

よって、 `$GOPATH = 作業ディレクトリ`にする必要があります。
今回は、`usr/local/go`をGoの作業ディレクトリにしようと思います。
環境変数は、`~/.bash_profile`で設定します。

```
# mkdir usr/local/go
# vi ~/.bash_profile
```
```bash_profile.
...省略

GOPATH=/usr/local/go
PATH=$GOPATH/bin:$PATH:$HOME/bin

export PATH
export GOPATH
```

$GOPATHを`/usr/local/go`として、$PATHは`$GOPATH/bin:$PATH:$HOME/bin`とします。
`~/.bash_profile`への変更を反映させて確認してみましょう。

```
# source ~/.bash_profile
# echo $GOPATH
/usr/local/go
# echo $PATH
/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/root/bin:/root/bin
```
しっかり反映されていますね。
ちなみに$PATHの中身は、`:`で区切られていますが、左にあるpathほど優先順位が高く、一番最初に見に行くのが一番左のpathとなります。

# bin, pkg, src ディレクトリの準備
bin:実行可能なbinaryファイルを保管しておく場所
pkg:パッケージを保管しておく場所
src:Goのソースコードをプロジェクト（パッケージ）ごとにディレクトリにして保管しておく場所

なので、この3つのディレクトリを$GOPATH配下に作リましょう。

```
# cd usr/local/go/
# mkdir bin pkg src
```

Goのソースコードは、`src`配下にプロジェクトごとにディレクトリで分けるので、今回は`hello`プロジェクトを作りましょう。

```
# mkdir /usr/local/go/src/hello
# cd usr/local/go/src/hello
# touch hello.go
# vi hello.go
```
「Hello, world!」を表示させる簡単なプログラム`hello.go`を作成します。

```go:hello.go
package main
import (
   "fmt"
)

func main(){
    fmt.Println("Hello, world!");
}

```
あとは、このhelloプロジェクトをbinary化してみます。

```
# go install /usr/local/go/src/hello
```
すると、$GOPATH/bin配下にプロジェクトの名前でバイナリファイルができています！

```
# ls /usr/local/go/bin/
hello
```
この`hello`を実行してみましょう！

```
# hello
Hello, world!
```
ちなみに、これはどの場所でコマンド叩いても実行されます。
なぜなら、`$PATH`のなかに`$GOPATH/bin`を設定したからです。
しかも、今回は$GOPATH/binを最優先にしているので、`cd`や`vi`といったLinuxの標準コマンドと同じ名前のバイナリファイルを作成した場合は、作成したバイナリファイルが優先されて実行されるので、命名には気をつけましょう！
それか欲張らず、$PATHの優先順位を下げるかですかね〜

今回は以上！お疲れ様でした〜！