golangのginで遊んでみる

# きっかけ
 - Goの後藤(私の苗字)になりたい
 - なんか音楽のサービスを作りたい
 - なんかやるからにはやることにファイル分けてやりたい
 - https://github.com/bossbuss0910/music_app ここにつけたしていきます

# 環境
 - 後藤はGoの初心者(すこーーしだけ触らしてもらったことある)
 - go1.4
 - フレームワーク　gin
 - データベース mysql (今回は使わない)
 - orm gorm (今回使わない)

# やること
まずginの[README.md](https://github.com/gin-gonic/gin)にあるapiの実装してみようかと
んでディレクトリ構成はこんなかんじ

``` ディレクトリ構成
├── app
│   ├── route.go
│   └── server.go
├── handlers
│   ├── hello.go
│   └── welcome.go
└─── main.go
```
こんな感じにする
# 中身の話
## main.go
 - 以下のように記述

``` main.go
package main
 
 import (
     "music_app/app"
     _"github.com/gin-gonic/gin"
 )
 
 func main() {
   app.Start()
 }
```
 - ここで ```import "github.com/gin-gonic/gin" ```ってやりたいけど我慢
 - いろんなサイトではmainにサーバ起動しているけどなんか見づらいからserver.goに書く

## server.go
 - なんかendlessって早くリスタートとかしてくれるらしい [endless](https://github.com/fvbock/endless)

``` server.go
package app 
                                             
import (                                                 
    "github.com/fvbock/endless"                          
    "github.com/gin-gonic/gin"                           
 )                                                       
                                                         
func Start() error {                                     
    app := setup()                                       
    return endless.ListenAndServe("localhost:8080", app) 
}                                                        
                                                         
func setup() *gin.Engine {                               
    app := gin.New()                                     
    RouteV1(app)                                         
    return app                                           
}                                                        
```

## route.go
``` route.go
 package app                                                 
                                                             
 import (                                                    
     "github.com/gin-gonic/gin"                              
     "music_app/handlers"                                    
 )                                                           
                                                             
 func RouteV1(app *gin.Engine) {                             
     helloHandler := handlers.NewHelloHandler()              
     welcomeHandler := handlers.NewWelcomeHandler()          
     apiGroup := app.Group("api")                            
     {                                                       
         apiGroup.GET("/user/:name", helloHandler.GetName)   
         apiGroup.GET("/welcome", welcomeHandler.GetName)    
     }                                                       
 }                                                           
```
このapp.Groupっていうのが結構よくて
この場合```localhost:8080/api/user/bossbuss0910```とやるとうまくいく
処理は各々handlerのファイルで書く

# hello.go
``` hello.go
package handlers                                     
                                                     
import (                                             
    "github.com/gin-gonic/gin"                       
    "net/http"                                       
)                                                    
                                                     
type helloHandlerInterface interface {               
    GetName(c *gin.Context)                          
}                                                    
                                                     
func NewHelloHandler() helloHandlerInterface {       
    return &helloHandler{}                           
}                                                    
                                                     
type helloHandler struct {                           
}                                                    
                                                     
func (h *helloHandler) GetName(c *gin.Context) {
    name := c.Param("name")                          
    c.String(http.StatusOK, "Hello %s", name)        
}                                                    
```
```NewHelloHandler()``` で生成する。そこからGetNameが呼ばれる


#　まとめ
 - 今回は簡単なapiの作成を行った
 - 次はgorm使ってCRUDの実装をします！！(なるべく早く)