Handlerに引数を追加したい時のための対応方法です。
なお、利用価値は たぶんない です。
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
に引数を追加する方法を記述します。
##元々のソース
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
{
message: "Hello!",
user: "Suzuki",
title: "ほげほげ"
}
localhost:8080/tanaka
{
message: "Hello!",
user: "Tanaka"
title: "ほげほげ"
}
userだけ違うだけで、ロジックは、ほぼ同じです。
これを共通化するために、以下のように変更しました。
修正後のソース
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")
}