اتصال درخواست فرمدیتا با struct سفارشی
Gin میتواند دادههای فرم را بهصورت خودکار به structهای تودرتو متصل کند. وقتی مدل داده شما از structهای کوچکتر تشکیل شده — چه بهعنوان فیلدهای تعبیهشده، فیلدهای اشارهگر، یا structهای ناشناس درونخطی — Gin سلسلهمراتب struct را پیمایش میکند و هر تگ form را به پارامتر query یا فیلد فرم مربوطه نگاشت میکند.
این برای سازماندهی فرمهای پیچیده در زیرساختارهای قابل استفاده مجدد بهجای تعریف یک struct تخت با فیلدهای زیاد مفید است.
package main
import ( "net/http"
"github.com/gin-gonic/gin")
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 main() { router := gin.Default()
router.GET("/getb", func(c *gin.Context) { var b StructB c.Bind(&b) c.JSON(http.StatusOK, gin.H{ "a": b.NestedStruct, "b": b.FieldB, }) })
router.GET("/getc", func(c *gin.Context) { var b StructC c.Bind(&b) c.JSON(http.StatusOK, gin.H{ "a": b.NestedStructPointer, "c": b.FieldC, }) })
router.GET("/getd", func(c *gin.Context) { var b StructD c.Bind(&b) c.JSON(http.StatusOK, gin.H{ "x": b.NestedAnonyStruct, "d": b.FieldD, }) })
router.Run(":8080")}تست
# Nested struct -- fields from StructA are bound alongside StructB's own fieldscurl "http://localhost:8080/getb?field_a=hello&field_b=world"# Output: {"a":{"FieldA":"hello"},"b":"world"}
# Nested struct pointer -- works the same way, Gin allocates the pointer automaticallycurl "http://localhost:8080/getc?field_a=hello&field_c=world"# Output: {"a":{"FieldA":"hello"},"c":"world"}
# Anonymous inline struct -- fields are bound by their form tags as usualcurl "http://localhost:8080/getd?field_x=hello&field_d=world"# Output: {"d":"world","x":{"FieldX":"hello"}}