ربط طلب بيانات النموذج بهيكل مخصص
يمكن لـ Gin ربط بيانات النموذج بالهياكل المتداخلة تلقائياً. عندما يتكون نموذج البيانات الخاص بك من هياكل أصغر — سواء كحقول مضمّنة أو حقول مؤشرات أو هياكل مضمّنة مجهولة — يتنقل Gin عبر تسلسل الهياكل ويربط كل علامة form بمعامل الاستعلام أو حقل النموذج المقابل.
هذا مفيد لتنظيم النماذج المعقدة في هياكل فرعية قابلة لإعادة الاستخدام بدلاً من تعريف هيكل مسطح واحد بحقول كثيرة.
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"}}