Gin: چطور یه فریمورک Go از «ساده» بر «آسان» ترجیح داد
خلاصهٔ کاملتر
نویسنده، Manuel Meida، از سال ۲۰۱۴ و پروژه Fyve - یه شبکه اجتماعی مبتنی بر علایق که هرگز موفق نشد - شروع میکنه. Gin ابزاریه که از دل اون پروژه بیرون اومد و ۱۲ سال بعد هنوز زنده و پرکاربرده.
در اون زمان، Martini فریمورک محبوب Go بود. به گفته نویسنده، README کوچیک بود و مدل middleware ظریف به نظر میرسید. ولی Martini از reflection-based dependency injection استفاده میکرد که handler هارو با هم سیمکشی میکرد. این یعنی وقتی یه چیزی خراب میشد، control flow مبهم بود - و این reflection روی هر request اجرا میشد.
نویسنده از یه سخنرانی Rob Pike به اسم «Simplicity is Complicated» الهام گرفت. تمایز کلیدی اینه: easy یعنی اولین مثال خوب به نظر میرسه؛ simple یعنی بعد از سالها، وقتی codebase پیر شده، هنوز میفهمیش چی داره میگذره.
Gin نقطه وسط بین Martini و net/http خام Go رو هدف گرفت. plain net/http کنترل کامل میده ولی همه plumbing رو باید دستی بنویسی. Martini همه چیز رو مخفی میکرد. Gin مسیر درخواست رو explicit نگه میداره، reflection نداره، و یه شیء به اسم Context همه repetitive کارها رو جمع میکنه.
r := gin.Default()
r.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
c.JSON(200, gin.H{"id": id})
})نویسنده اشاره میکنه که Fyve هیچوقت موفق نشد ولی Gin که ابزار جانبی پروژه بود، ۱۲ سال زنده موند. درسش اینه که ابزارهایی که اصل طراحیشون محکمه، اغلب از پروژههایی که برایشون ساخته شدن دوام بیشتری دارن.
نکات کلیدی:
- Gin در ۲۰۱۴ توسط سازندهاش برای یه پروژه شخصی ساخته شد
- تمایز «ساده» (simple) و «آسان» (easy) اساس طراحیشه
- Gin از reflection استفاده نمیکنه و مسیر درخواست رو explicit نگه میداره
- Context یه شیء مرکزیه که route params، request parsing، و response رو جمع میکنه




