6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Handlerに引数を追加したい時

Last updated at Posted at 2019-04-22

Handlerに引数を追加したい時のための対応方法です。
なお、利用価値は たぶんない です。

main.go
package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()

    router.GET("/suzuki", GetSampleSuzuki)
}
func GetSampleSuzuki(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{"message": "Hello!"})
}

上記のようなソースがあった時に、GetSampleSuzukiに引数を追加する方法を記述します。

##元々のソース

main.go
package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

	router.GET("/suzuki", GetSampleSuzuki)
	router.GET("/tanaka", GetSampleTanaka)
	router.Run(":8080")
}

func GetSampleSuzuki(c *gin.Context) {
	user := "Suzuki"
	title := "ほげほげ"
	c.JSON(http.StatusOK, gin.H{"message": "Hello!", "user": user, "title": title})
}

func GetSampleTanaka(c *gin.Context) {
	user := "Tanaka"
	title := "ほげほげ"
	c.JSON(http.StatusOK, gin.H{"message": "Hello!", "user": user, "title": title})
}

実行すると、以下の結果が返ってきます。

localhost:8080/suzuki

json
{
message: "Hello!",
user: "Suzuki",
title: "ほげほげ"
}

localhost:8080/tanaka

json
{
message: "Hello!",
user: "Tanaka"
title: "ほげほげ"
}

userだけ違うだけで、ロジックは、ほぼ同じです。
これを共通化するために、以下のように変更しました。

修正後のソース

main.go
package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

	router.GET("/suzuki", Adduser(GetSample))
	router.GET("/tanaka", Adduser(GetSample))
	router.Run(":8080")
}

func Adduser(fn func(*gin.Context, *string, *string)) gin.HandlerFunc {
	return func(c *gin.Context) {
		user := c.Request.URL.Path[1:]
		title := "ほげほげ"
		fn(c, &user, &title)
	}
}

func GetSample(c *gin.Context, user *string, title *string) {
	c.JSON(http.StatusOK, gin.H{
		"message": "Hello!",
		"user":    *user,
		"title":   *title,
	})
}

共通の関数(Adduser)の用意

まず、GetSampleSuzuki と GetSampleTanaka を共通化するために
GetSampleを用意します。
引数は、c *gin.Context に加え、user *string, title *stringを追加します。

func GetSample(c *gin.Context, user *string, title *string) のような形になります。

さらに呼出し元の router.GET("/suzuki", GetSampleSuzuki)の部分を
router.GET("/suzuki", Adduser(GetSample))のように変更し、共通の処理が行えるようにします。

GinのGETの定義をみると、引数がHandlerFuncになっているので
'Adduserの戻り値にHandlerFuncを返すようにします。 つまり、いつものfunc(c *gin.Context)`を返しようにします。
さらに、先ほど追加した'GetSamaple'と同じ引数の関数を呼び出すようにします。

よって、func Adduser(fn func(*gin.Context, *string, *string)) gin.HandlerFunc の形になります。

共通の関数(Adduser)の内容

いつもの *gin.Contextをreturnし、 HandlerFunc を返すようにします。
その関数の中で、共通のuserとtitleの処理を追加し、引数の fn func(*gin.Context, *string, *string)の形式でfn(c, &user, &title) を返します。

#まとめ

以下のような形式で作成・対応できます。


func main() {
    router := gin.Default()
    router.GET("/suzuki", Adduser(GetSample))
}

func Adduser(fn func(*gin.Context, [])) gin.HandlerFunc {
	return func(c *gin.Context) {
           // 追加した引数に対する処理
           fn(c, <引数名>)
	}
}

func GetSample(c *gin.Context, <引数名> []) {
         // 何かの処理
}

どのような場面で使うかは考えていません。
そもそも、以下の処理で名前の取得は可能だし。

func main() {
    router := gin.Default()
    router.GET("/:name", GetSample)
}

func GetSample(c *gin.Context){
        name := c.Param("name")
}
6
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?