お前らのGo開発環境は間違っている！GOPATHからの解放。

#Welcome Gopher

Gopherの皆さんこんにちは。

Goの環境構築をより使いやすく、そしてシンプルにするためにこの記事を書きました。

Goの環境構築時に、GOPATHを設定した方が対象です。

## GOPATHからの開放

Goの開発環境を構築する際に、`GOPATH`を設定する記事が散見されます。

しかし、時代は変わるもの、Goのエコシステムも大きく変わろうとしています。

長い間Goの環境を支えてきた`GOPATH`も、`Go 1.13`からは廃止されたようです（たぶん）

Goの[ブログ](https://blog.golang.org/modules2019)にも記載されています

>Our aim is for Go 1.13, scheduled for August 2019, to enable module mode by default (that is, to change the default from auto to on) and deprecate GOPATH mode. In order to do that, we’ve been working on better tooling support along with better support for the open-source module ecosystem.

`GOPATH`に変わり、`GO 1.11`から実装された`module`が今後のGoの開発には大きく貢献していくでしょう。

これから、Go開発に乗り出そうとする人は過去の栄光を捨て去り、これまでGoで開発してきた人は既存プロジェクトの様子を見ながら新しいGoのエコシステムに乗り換えましょう。

## Goプロジェクトに`module`を導入

と言っても、環境構築をさらに楽にするために導入された`module`なので、導入も驚くほど簡単です。
より詳しい情報は、[公式ページ](https://github.com/golang/go/wiki/Modules)を確認してください
### Goのインストール
####On Mac
```:terminal
$ brew install go
```
###プロジェクトのセットアップ
GOPATH以外のディレクトリで、プロジェクトを作成します。

> と言うのも、GOPATH以下のディクトリでは、`module`は無効になっています。
GOPATHを指定していない場合、デフォルトでは,`$HOME/go`になっているので、それ以外のディレクトリでプロジェクトを作ります。

```:terminal
$ mkdir go-module-env

$ cd go-module-env
```

### Go moduleの導入
モジュール名、もしくはプロジェクト名で`module`を初期化します。

```:terminal
$ go mod init go-module-env
go: creating new go.mod: module go-module-env
```

### ソースコードの作成
ソースコードを用意します。

以下のコードは、Goの軽量Webフレームワーク`Gin`を用いた、サーバーに送られるリクエストをリッスンして、JSONを返すだけの簡単なwebアプリです。
`main.go`に、`Gin`を使用したコードを書きましょう。
(ソースコードは、Ginの[リポジトリ](https://github.com/gin-gonic/gin)からお拝借)

```:terminal
$ echo 'package main
import "github.com/gin-gonic/gin"
func main() {
        r := gin.Default()
        r.GET("/ping", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "pong",
                })
        })
        r.Run() 
}' > main.go
```

#### or
```:terminal
$ touch main.go
```

```go:main.go
package main
import "github.com/gin-gonic/gin"
func main() {
        r := gin.Default()
        r.GET("/ping", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "pong",
                })
        })
        r.Run() 
}
```



###Build!!!

ビルドしましょう！

```:terminal
$ go build
go: finding module for package github.com/gin-gonic/gin
go: found github.com/gin-gonic/gin in github.com/gin-gonic/gin v1.5.0
```

ちなみに、`go.mod`を見ると、パッケージとその依存関係を確認できます。

```:terminal
$ cat go.mod
module go-module-env

go 1.14

require github.com/gin-gonic/gin v1.5.0
```
Goのバージョンが`go 1.14`で、`gin v1.5.0`の依存関係を明示しています。

### 


### Run!!!

ビルドで作成された実行ファイルを使い、ソースコードを実行します。

```:terminal
$ ./go-module-env
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
```

実行時に、ネットワークへの接続の許可の画面が表示されます。
「許可」で許可しましょう。
<img width="532" alt="スクリーンショット 2020-03-18 8.55.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436904/7089860f-7a83-b128-189a-dcc78e433758.png">

これで、全ての準備が整いました。
http://localhost:8080/ping にアクセスしてみましょう。

<img width="495" alt="スクリーンショット 2020-03-18 9.13.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436904/18d84746-adb3-a5d9-7019-c32af7d0251b.png">

JOSN形式で、レスポンスが返ってきました。


では、ターミナルを見てみましょう。

```:terminal
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
[GIN] 2020/03/18 - 09:13:11 | 200 |     236.388µs |             ::1 | GET      /ping
```
先ほどのコマンドの一番下に、`/ping`への`GET`リクエストを取得して、`200ステータス`を返していることが確認できました。

これで、`Go module`を使ったGoプロジェクトの作成が終わりました。

うむ、簡単である

##Happy Hacking :sunglasses: !