フォーム投稿されたリクエストを構造体にバインドする
下記のサンプルコードは、カスタム構造体を使っています。
type StructA struct { FieldA string `form:"field_a"`}
type StructB struct { NestedStruct StructA FieldB string `form:"field_b"`}
type StructC struct { NestedStructPointer *StructA FieldC string `form:"field_c"`}
type StructD struct { NestedAnonyStruct struct { FieldX string `form:"field_x"` } FieldD string `form:"field_d"`}
func GetDataB(c *gin.Context) { var b StructB c.Bind(&b) c.JSON(200, gin.H{ "a": b.NestedStruct, "b": b.FieldB, })}
func GetDataC(c *gin.Context) { var b StructC c.Bind(&b) c.JSON(200, gin.H{ "a": b.NestedStructPointer, "c": b.FieldC, })}
func GetDataD(c *gin.Context) { var b StructD c.Bind(&b) c.JSON(200, gin.H{ "x": b.NestedAnonyStruct, "d": b.FieldD, })}
func main() { router := gin.Default() router.GET("/getb", GetDataB) router.GET("/getc", GetDataC) router.GET("/getd", GetDataD)
router.Run()}
curl
を使った結果です。
$ curl "http://localhost:8080/getb?field_a=hello&field_b=world"{"a":{"FieldA":"hello"},"b":"world"}$ curl "http://localhost:8080/getc?field_a=hello&field_c=world"{"a":{"FieldA":"hello"},"c":"world"}$ curl "http://localhost:8080/getd?field_x=hello&field_d=world"{"d":"world","x":{"FieldX":"hello"}}
NOTE: 下記の構造体はサポートしていません。
type StructX struct { X struct {} `form:"name_x"` // ここが form を持ってしまっている}
type StructY struct { Y StructX `form:"name_y"` // ここが form を持ってしまっている}
type StructZ struct { Z *StructZ `form:"name_z"` // ここが form を持ってしまっている}
端的に言えば、ネストした構造体は form
を今は持つことができません。