🦔

【go超初心者】ginのサンプルコードsetupRouter()を読むゾ

2024/03/01に公開

この記事のゴール

本記事では超初心者がginのサンプルコードのsetupRouter()を読んで基本構文を把握します。
大目的は『ginのサンプルコードを日本語で言語化する。』ですが、
見返すときに読みやすい記事にしたいので、記事を小分けにして書いています。
(なんとなくginのノリがわかったので途中で、記事作成やめてます。。。)
追記:実行環境についてはもっと調べる必要があります。

背景

筆者はgoの超初心者です。
以前goのプロジェクトを作成しました。
https://zenn.dev/articles/5d66741a60b24e/edit
goの基本的な言語仕様とginおよびgoの実行環境について少しでも知りたいという動機です。

ginのサンプルAPIの実装コード

前提として、このサンプルコードの目的はHttpリクエストのルーティングの設定である。

func setupRouter() *gin.Engine {
	// Disable Console Color
	// gin.DisableConsoleColor()
	r := gin.Default()

	// Ping test
	r.GET("/ping", func(c *gin.Context) {
		c.String(http.StatusOK, "pong")
	})

	// Get user value
	r.GET("/user/:name", func(c *gin.Context) {
		user := c.Params.ByName("name")
		value, ok := db[user]
		if ok {
			c.JSON(http.StatusOK, gin.H{"user": user, "value": value})
		} else {
			c.JSON(http.StatusOK, gin.H{"user": user, "status": "no value"})
		}
	})

	// Authorized group (uses gin.BasicAuth() middleware)
	// Same than:
	// authorized := r.Group("/")
	// authorized.Use(gin.BasicAuth(gin.Credentials{
	//	  "foo":  "bar",
	//	  "manu": "123",
	//}))
	authorized := r.Group("/", gin.BasicAuth(gin.Accounts{
		"foo":  "bar", // user:foo password:bar
		"manu": "123", // user:manu password:123
	}))

	/* example curl for /admin with basicauth header
	   Zm9vOmJhcg== is base64("foo:bar")

		curl -X POST \
	  	http://localhost:8080/admin \
	  	-H 'authorization: Basic Zm9vOmJhcg==' \
	  	-H 'content-type: application/json' \
	  	-d '{"value":"bar"}'
	*/
	authorized.POST("admin", func(c *gin.Context) {
		user := c.MustGet(gin.AuthUserKey).(string)

		// Parse JSON
		var json struct {
			Value string `json:"value" binding:"required"`
		}

		if c.Bind(&json) == nil {
			db[user] = json.Value
			c.JSON(http.StatusOK, gin.H{"status": "ok"})
		}
	})

	return r
}

関数定義

関数定義の構文

以下が関数の定義部分。

func 関数名(パラメータ名 パラメータ型, ...) 返り値型 {
    // 処理
}

今回のサンプルコードでは戻り値の型に*gin.Engineが指定されている。

func setupRouter() *gin.Engine {
	// Disable Console Color
	// gin.DisableConsoleColor()
	r := gin.Default()

*gin.Engineとはなんだろうか。
ginを理解するうえで大事っぽい!

gin.Engine

ginフレームワークにおけるメインのエンジン。
軽量で高速なHTTPフレームワークを実現する中心的な部分。
主な役割として、HTTPサーバーの設定、ルーティングの定義、ミドルウェアの適用などを行う。
「*」はポインタ。
戻り値にポインタ付きで指定することで、明示的に参照渡しになっている。
(読む方からしてもわかりやすい。)

gin.Default()

r := gin.Default()

gin.Default()によってデフォルトのエンジンが作成される。
この記述によってデフォルトのミドルウェアが設定され、一般的なHTTPサーバーの機能が提供される。

ちなみに:=は新しい変数に代入する際に使う演算子。
再代入は=を使う。

まとめ

なんとなく読めるのが、Goの利点って言われるのがなんかわかった
気がする。すごいGo。

Discussion