Go言語を真剣に勉強してみた〜WEBアプリケーション開発編〜

#はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
さて今回は「Go言語を真剣に勉強してみた〜WEBアプリケーション開発編〜」と言うこと３、４回ぐらいに分けて紹介していけたらと思います。
では、早速いってみましょう:point_up:



#インポート
パッケージの**<<"net/http">>**をインポートします。
#サーバー起動
"net/http"の**ListenAndServe()**を使います。

```golang
http.ListenAndServe("サーバ名:ポート番号", ハンドラ)
```
**＊第一引数のサーバ名を省略すると、localhostになる。**
**＊第二引数は通常nilでよい。**
#HTMLファイルの読み込み
"net/http"の**Handle()**を使います。

```golang
http.Handle("アクセス先ルート", http.FileServer(http.Dir("読み込むHTMLファイルのディレクトリ名")))
```
＜＜以下例＞＞
○staticディレクトリの中のHTMLファイルを読み込む

＜ディレクトリ構造＞
　|-static
　|　　|- index.html
　|-server.go

```golang:server.go
func main() {
    http.Handle("/", http.FileServer(http.Dir("static"))))
    http.ListenAndSeave(":9999", nil)
}
```
http\://localhost:9999にアクセスするとstaticディレクトリの中のindex.htmlが呼ばれる。
#テンプレートファイルの使用
静的ページではなくGoで動的ページを作りたいときに使う

##インポート
パッケージの**<<"html/template">>**をインポートします。または**<<"text/template">>**をインポートします。

＊*text/template*:汎用テンプレート用のパッケージ。
＊*html/template*:プレースホルダに変換対象の文字列のhtmlタグをエスケープする。

##テンプレートファイルの場所指定
```golang
path, _ := os.Getwd()//カレントディレクトリの取得（osパッケージをインポート）
t := template.Must(template.ParseFiles(path + "テンプレートファイルのある所のパス"))
```	
##テンプレートの描画

```golang
t.ExecuteTemplate(http.ResponseWrite, "テンプレートファイル名", 送る値)
```
##ハンドラの登録
net/httpパッケージの**HundleFunc()**を使う。

```golang
http.HandleFunc("アクセス先ルート", クロージャ)

func クロージャ(w http.ResponceWrite, r *http.Request {
   //アクセス先ルートにアクセスされたときに実行する事を記述
}
```
##テンプレートファイルの値表示(アクションタグ)
- テンプレートに渡された引数を出力

```
{{ . }}
```
- テンプレートに渡された値が構造体

```
{{ .構造体のフィールド名 }}
```
- 条件分岐

```
{{ if .(構造体のフィールド名) }}

{{ else }}

{{ end }}
```
- ループ

```
{{ range .(構造体のフィールド名) }}

{{ else }}

{{ end }}
```
＊渡された引数が配列やスライスといった配列系しか回せない

- ~~テンプレートに渡された引数がからなら処理２をからでなければ処理１を実行~~
- テンプレートに渡された引数が空でなければ処理１を空なら処理２が出力される。
 
```
{{ with .(構造体のフィールド名) }}
   //処理1
{{ else }}
   //処理2
{{ end }}
```

＜＜以下例＞＞
○staticディレクトリの中のテンプレートファイルを読み込む

＜ディレクトリ構造＞
　|-static
　|　　|- index.html.tpl
　|-server.go

```golang:server.go
func clockHandler(w http.ResponseWriter, r *http.Request) {
    path, _ := os.Getwd()
    t := template.Must(template.ParseFiles( path + "/static/index.html.tpl"))


    if err := t.ExecuteTemplate(w, "index.html.tpl", time.Now()); err != nil {
         log.Fatal(err)
    }
}
func main() {
    http.HandleFunc("/", clockHandler)
    http.ListenAndSeave(":9999", nil)
}
```
```html:index.html.tpl
<!DOCTYPE html>
<html>
<body>
今現在{{ .Hour }}時{{ .Minute }}分です。
</body>
</html>
```

http\://localhost:9999にアクセスするとstaticディレクトリの中のindex.htmlが呼ばれる。


以上。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。
次回「Go言語を真剣に勉強してみた〜WEBアプリケーション開発編②〜」
よろしければ、こちらもご覧ください。
「Go言語を真剣に勉強してみた〜基本構文編①（変数、定数、条件分岐、繰り返し処理）〜」については[こちら](https://qiita.com/watataku/items/f12163ade0d820d00bba)から。
「Go言語を真剣に勉強してみた〜基本構文編②（配列）〜」については[こちら](https://qiita.com/drafts/50de84b191f73d281be9)から。
「Go言語を真剣に勉強してみた〜基本構文編③（関数）〜」については[こちら](https://qiita.com/watataku/items/79f5e49d08000838150d)から。
「Go言語を真剣に勉強してみた〜基本構文編④（ポインタ、構造体）〜」については[こちら](https://qiita.com/watataku/items/ef518d59a4ae31b45b63)から。
「Go言語を真剣に勉強してみた〜パッケージ編〜」については[こちら](https://qiita.com/watataku/items/d3e0133d0c1574422c72)から。
「Go言語を真剣に勉強してみた〜データベース接続(MySQL)編〜」については[こちら](https://qiita.com/watataku/items/8c94f8f380f91aa3f3e5)から。

#追記（2018/10/20）
##その他のアクションタグ
- 引数のbool値をnot演算する

```
{{ not 引数 }}
```
- 引数１と引数２でand演算する

```
{{ and 引数１ 引数２ }}
```
- 引数１と引数２でor演算する

```
{{ or 引数１ 引数２ }}
```
- 引数をエスケープする

```
{{ html 引数 }}
```
- テンプレート変数

```
{{ $変数名 := 値 }}
```
- テンプレートに渡された引数配列でそのサイズを返す

```
{{ len 引数 }}
```