رفتن به محتوا

از Go 1.22 تا 1.25: تغییراتی که واقعاً استفاده می‌کنم

متغیرهای حلقه‌ای که بالاخره درست رفتار می‌کنند، range روی عدد و iteratorها، ServeMux هوشمندتر، WaitGroup.Go و GOMAXPROCS آگاه از کانتینر.

انتشار 1 دقیقه مطالعهخواندن به English

هر نسخه‌ی Go عمداً کوچک است، اما وقتی چهار نسخه را کنار هم بگذاری، Goیی که امروز می‌نویسم با دو سال پیش فرق محسوسی دارد. این‌ها تغییراتی هستند که واقعاً در کد محیط واقعی من، بیشتر در بک‌اند یک پلتفرم معاملاتی، دیده می‌شوند.

نسخه‌ی 1.22: متغیر حلقه و یک روتر واقعی

متغیر جداگانه برای هر تکرار

باگ معروف از بین رفت. حالا هر تکرار حلقه کپی خودش را از متغیر دارد، پس closureها و goroutineها همان چیزی را می‌گیرند که انتظار داری:

go
for _, order := range orders {
	go func() {
		process(order) // از Go 1.22 امن است — دیگر `order := order` لازم نیست
	}()
}

range روی عدد صحیح

go
for i := range 3 {
	fmt.Println(i) // 0 1 2
}

الگوی متد و wildcard در net/http

برای سرویس‌های کوچک دیگر سراغ کتابخانه‌ی روتر نمی‌روم:

go
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() را حذف می‌کند:

go
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 بروید.

قبل از ارتقا حتماً یادداشت‌های رسمی انتشار را بخوانید؛ این نوشته فقط چیزهایی را پوشش می‌دهد که برای من مهم بود.

اشتراک‌گذاری