【Go言語】ginを使ってローカル環境を構築する

# はじめに
## 概要
この記事ではginを用いて、ローカル環境を構築し、ブラウザにHello Worldという文字列を表示させまでの実装を行います。そのためには、ginとは何か、ginを用いて何が可能となるかを学ぶ必要があります。実際にコードを書きながら、それらを1つ1つ丁寧に説明していきます。

## 目的
- ginを用いてローカル環境を構築する方法を理解すること

# 事前準備

## ディレクトリとファイルの準備をしよう
まずは、今回作業するディレクトリとファイルを準備しましょう。まずはディレクトから作成します。

### ディレクトリをmkdirコマンドで作成しましょう
以下のコマンドで指定の場所に新しいフォルダを作りましょう。

```bash:ターミナル
% mkdir hello_world
```
ここではhello_world名前のフォルダを作ります。

### cdコマンドでディレクトリを移動しましょう
先ほど作成したディレクトリに移動しましょう。

```bash:ターミナル
% cd hello_world
```

### touchコマンドでファイルを作成しましょう
以下のようにファイルを作成します。

```bash:ターミナル
% touch main.go
```
このmain.goがこれから作業していくファイルです。

### ディレクトリ構造を確認しましょう
以下のようなディレクトリ構造になっていれば成功です。

```bash
hello_world
├── main.go
```

### main.goを以下のように記述しましょう

```go:main.go
package main

func main() {
 
}
```
これで事前準備は完了です。

# ginを用いてローカル環境を構築
ここからginを実施に使っていきます。まずはginとは何かを理解しましょう。
## ginを使用する準備をしよう
### <font color="Red">gin
ginとは小規模のWebアプリケーションの開発を目的としたGoのフレームワークです。処理が軽量で、記述するコードがシンプルであることが特徴です

### ginをインストールしましょう
以下のコマンドを実行して、ginをインストールしましょう。

```bash:ターミナル
% go get github.com/gin-gonic/gin
```

### ginをimportしましょう
ginのインストールに成功したら、次はginをアプリケーション内で使えるようにimportしてあげる必要があります。以下のようにmain.goを記述しましょう。

```go:main.go
package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
 
}
```
これでアプリケーション内でginを使用することができるようになりました。

## ginを用いてリクエスト内容を決定しよう

### ルータを作成しよう
以下のようにmain.goを記述しましょう。

```go:main.go
package main

import (

    "github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

}
```

### <font color="red">gin.Default()</font>
デフォルトで用意されているミドルウェアーでginのルータを作成することができます。ルータは異なるネットワーク間の接続や中継をします。

```go:gin.Default()の中身
 // Default returns an Engine instance with the Logger and Recovery middleware already attached. 
func Default() *Engine { 
  engine := New() 
  engine.Use(Logger(), Recovery()) 
  return engine 
} 
```
ここで Use というメソッドを使用し Logger と Recovery というミドルウェアを設定しています。Loggerは標準出力にログ出力すミドルウェアであり、Recoveryは機能としてはパニックが起きた時にリカバーして500を返すミドルウェアです。




### ブラウザに表示するファイルを指定しましょう
先ほどの記述でルータを作成することができました。次はこのルータを用いて、ブラウザで表示させるファイルを指定します。main.goを以下のように記述しましょう。

```go
package main

import (

    "github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

    router.LoadHTMLGlob("templates/*.html")

}
```

今回の記述により、templatesディレクトリのhtmlファイルを呼び出すという宣言ができました。

### <font color="red">router.LoadHTMLGlob()</font>
ブラウザに表示させるhtmlファイルのディレクトリを指定する。その指定により、htmlファイルとhttpメソッドを自由に指定することが可能となる（次の記述に出てくる）。

### ブラウザに表示させるhtmlファイルを作成しましょう

まずはテンプレートファイルを作成します。以下のコマンドを実行しましょう。

```bash
% mkdir templates
```
次に、以下のコマンドでファイルを作成しましょう。

```bash
% touch templates/index.html
```

### ディレクトリ構造を確認しましょう
以下のようなディレクトリ構造になっていれば成功です。

```bash
hello_world
├── main.go
├── templates
       ├── index.html
```
### 表示させるhtmlファイルを記述しましょう
以下のようにindex.htmlを記述しましょう。

```html:index.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <title>Sample App</title>
</head>

<body>
  <h1>Hello World!!!</h1>
</body>

</html>

```
### GETメソッドでルーティングを指定しよう

```go
package main

import (

    "github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

    router.LoadHTMLGlob("templates/*.html")

    router.GET("/", func(ctx *gin.Context){
        ctx.HTML(200, "index.html", gin.H{})
    })

}
```
### <font color="red">router.GET()</font>
この記述によりルーティングを指定することができます。第一引数にURLパターン、第二引数にリクエストの内容を指定します。phpやnode.jsに精通している人からすれば馴染みのある記述ですね。

```bash:router.GET()の文法
route.Get('/○○/{パラメータ}',function( 受け取る引数 ){....});
```

### ルーティングを実行しましょう
以下のようにmain.goを記述しましょう。

```go
package main

import (

    "github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

    router.LoadHTMLGlob("templates/*.html")

    router.GET("/", func(ctx *gin.Context){
        ctx.HTML(200, "index.html", gin.H{})
    })

    router.Run()
}
```

### ブラウザの表示を確認しましょう。
まずはmain.goファイルを実行する。

```bash:ターミナル
% go run main.go
```
そして、ブラウザでlocalhosot:8080を確認しましょう。

<img width="761" alt="スクリーンショット 2020-04-11 16.49.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452544/8ac5c340-fa4c-5b55-7b94-838b3773fd36.png">


上記のように表示されていれば成功です。

# この記事の振り返り