از Go 1.22 تا 1.25: تغییراتی که واقعاً استفاده میکنم
متغیرهای حلقهای که بالاخره درست رفتار میکنند، range روی عدد و iteratorها، ServeMux هوشمندتر، WaitGroup.Go و GOMAXPROCS آگاه از کانتینر.
هر نسخهی Go عمداً کوچک است، اما وقتی چهار نسخه را کنار هم بگذاری، Goیی که امروز مینویسم با دو سال پیش فرق محسوسی دارد. اینها تغییراتی هستند که واقعاً در کد محیط واقعی من، بیشتر در بکاند یک پلتفرم معاملاتی، دیده میشوند.
نسخهی 1.22: متغیر حلقه و یک روتر واقعی
متغیر جداگانه برای هر تکرار
باگ معروف از بین رفت. حالا هر تکرار حلقه کپی خودش را از متغیر دارد، پس closureها و goroutineها همان چیزی را میگیرند که انتظار داری:
for _, order := range orders {
go func() {
process(order) // از Go 1.22 امن است — دیگر `order := order` لازم نیست
}()
}range روی عدد صحیح
for i := range 3 {
fmt.Println(i) // 0 1 2
}الگوی متد و wildcard در net/http
برای سرویسهای کوچک دیگر سراغ کتابخانهی روتر نمیروم:
mux := http.NewServeMux()
mux.HandleFunc("GET /orders/{id}", getOrder)
mux.HandleFunc("POST /orders", createOrder)نسخهی 1.23: iteratorها
range روی تابع، «پیمایش یک مجموعه» را به یک مفهوم درجهیک و ترکیبپذیر تبدیل میکند. پکیج iter شکلها را تعریف
میکند و slices و maps توابع کمکی گرفتهاند که iterator برمیگردانند.
نسخهی 1.24: رفاه برنامهنویس
- پشتیبانی کامل از type aliasهای جنریک.
testing.B.Loopاشتباه در بنچمارکنویسی را سختتر میکند.- گزینهی
omitzeroدر تگ JSON مقدار صفر را حذف میکند، حتیtime.Timeصفر را؛ کاری کهomitemptyهیچوقت نمیکرد. - پیادهسازی جدید map با Swiss table: سریعتر، بدون تغییر کد.
نسخهی 1.25: همزمانی راحتتر و کانتینرها
sync.WaitGroup.Go رقص Add(1) و defer Done() را حذف میکند:
var wg sync.WaitGroup
for _, feed := range feeds {
wg.Go(func() {
feed.Poll(ctx)
})
}
wg.Wait()روی لینوکس هم runtime حالا هنگام انتخاب مقدار پیشفرض GOMAXPROCS محدودیت CPU کانتینر را در نظر میگیرد؛
یک برد واقعی وقتی سرویس داخل Docker با سهمیهی CPU اجرا میشود.
جمعبندی
اگر کدبیس شما Go 1.22 به بالا را هدف گرفته، کپیهای x := x را پاک کنید، قبل از اضافه کردن روتر الگوهای
ServeMux را امتحان کنید و هر جا کار یک تابع «تولید یک دنباله» است سراغ iterator بروید.
قبل از ارتقا حتماً یادداشتهای رسمی انتشار را بخوانید؛ این نوشته فقط چیزهایی را پوشش میدهد که برای من مهم بود.