🗂
【Ginキャッチアップ③】レスポンスを構造体で扱う
はじめに
Ginのキャッチアップをしているので、備忘録として学習した内容をアウトプットしていきます。
今回はユーザー情報を扱う構造体を実装し、レスポンスに使用する方法について解説していきます。
前回の記事はこちら
環境
- macOS Monterey 12.4
- VSCode 1.71.0
- go1.19
今回やること
- ユーザー情報を扱う構造体を実装する
-
GET /dummy
エンドポイントを作成し、ユーザー情報のダミーデータをレスポンスする
ディレクトリ構成
gin_example
| - main.go
| - model
| |-info.go
ユーザー情報を扱う構造体を実装する
前回のBasic認証のときに使用していた認証データに紐づくユーザーデータ
の構造体を実装します。
仕様
- メールアドレスと電話番号を持つ
- ダミーデータを生成できる
- JSON(gin.H型)に変換するメソッドを持つ
model/info.go
package model
import (
"fmt"
"github.com/gin-gonic/gin"
)
type Info struct {
mail string
phone string
}
// ダミーデータを生成
func DummyInfo(index int) *Info {
result := new(Info)
result.mail = "mail" + fmt.Sprint(index)
result.phone = "phone" + fmt.Sprint(index)
return result
}
// InfoからJSONに変換
func (info Info) ToJson() gin.H{
result := gin.H{
"mail": info.mail,
"phone": info.phone,
}
return result
}
構造体を定義します。
書き方: type <構造体名> struct
type Info struct {
mail string // メールアドレス
phone string // 電話番号
}
ダミーデータを生成するコンストラクタを定義します。
今回は引数に渡した番号を元にメールアドレスと電話番号を生成して初期化するコンストトラクタを定義します。
intをstringに変換する方法はいくつかありますが、今回はfmt.Sprint
を使用します。
// ダミーデータを生成
func DummyInfo(index int) *Info {
result := new(Info)
result.mail = "mail" + fmt.Sprint(index)
result.phone = "phone" + fmt.Sprint(index)
return result
}
JSONに変換するメソッドを定義します。
Goはクラスの概念が存在しないため、一般的なオブジェクト指向言語のようなメソッドの定義ではなく
関数にレシーバーを書くかたちでメソッドを定義します。
書き方: func (レシーバー名 レシーバー型) メソッド名(引数名 引数型) 戻り値型
func (info Info) ToJson() gin.H{
result := gin.H{
"mail": info.mail,
"phone": info.phone,
}
return result
}
Infoはmodel/info.go
に記述し別パッケージとして扱うため
mainなどの別パッケージからimportして呼び出せるように
コンストラクタやメソッドは頭文字を大文字として定義しています。
参考
GET /dummy
エンドポイントを作成し、ユーザー情報のダミーデータをレスポンスする
ダミーデータをレスポンスするエンドポイントを作成します。
main.go
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"gin_example/model"
)
func main() {
engine:= gin.Default()
// ダミーデータをレスポンスするエンドポイントを作成する(JSON)
engine.GET("/dummy", func(ctx *gin.Context) {
// ダミーデータを作る
info := model.DummyInfo(1)
// JSONに変換してレスポンスする
ctx.JSON(http.StatusOK, info.ToJson())
})
engine.Run()
}
main.goでInfoを使用できるようにするためにimportします。
import (
"gin_example/model"
)
参考
GET /dummy
エンドポイントを実装します。
// ダミーデータをレスポンスするエンドポイントを作成する(JSON)
engine.GET("/dummy", func(ctx *gin.Context) {
// ダミーデータを作る
info := model.DummyInfo(1)
// JSONに変換してレスポンスする
ctx.JSON(http.StatusOK, info.ToJson())
})
Discussion