🗂

【Ginキャッチアップ③】レスポンスを構造体で扱う

2022/09/25に公開

はじめに

Ginのキャッチアップをしているので、備忘録として学習した内容をアウトプットしていきます。
今回はユーザー情報を扱う構造体を実装し、レスポンスに使用する方法について解説していきます。

前回の記事はこちら
https://zenn.dev/moimoi_prog/articles/go_gin_example_2

環境

  • macOS Monterey 12.4
  • VSCode 1.71.0
  • go1.19

今回やること

  • ユーザー情報を扱う構造体を実装する
  • GET /dummyエンドポイントを作成し、ユーザー情報のダミーデータをレスポンスする

ディレクトリ構成

gin_example
  | - main.go
  | - model
  |    |-info.go

ユーザー情報を扱う構造体を実装する

前回のBasic認証のときに使用していた認証データに紐づくユーザーデータの構造体を実装します。

仕様

  1. メールアドレスと電話番号を持つ
  2. ダミーデータを生成できる
  3. 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して呼び出せるように
コンストラクタやメソッドは頭文字を大文字として定義しています。

参考
https://qiita.com/zurazurataicho/items/4a95e0daf0d960cfc2f7

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"
)

参考
https://www.kwbtblog.com/entry/2020/04/23/114706

GET /dummyエンドポイントを実装します。

// ダミーデータをレスポンスするエンドポイントを作成する(JSON)
engine.GET("/dummy", func(ctx *gin.Context) {
  // ダミーデータを作る
  info := model.DummyInfo(1)

  // JSONに変換してレスポンスする
  ctx.JSON(http.StatusOK, info.ToJson())
})
GitHubで編集を提案

Discussion