ورژن 1.27 زبان Go منتشر شد: متدهای generic، JSON v2، و رمزنگاری پسا-کوانتومی
حدود ۶ دقیقه مطالعه
تیم Go، شش ماه بعد از Go 1.26، نسخهی جدید زبان یعنی Go 1.27 رو منتشر کرد. طبق قول همیشگی سازگاری Go 1، تقریباً همهی برنامههای موجود بدون تغییر کامپایل و اجرا میشن. این نسخه تغییرات قابلتوجهی تو زبان، toolchain، runtime، و کتابخونهی استاندارد داره.
بزرگترین تغییر زبانی: متدهای Generic
قبل از Go 1.27، اگه میخواستی یه متد generic روی یه نوع خاص داشته باشی، مجبور بودی برای هر نوع جدا یه متد بنویسی. مثلاً math/rand/v2.Rand قبلاً باید متدهای جدا برای Int32N، Int64N، IntN و بقیهی انواع صحیح میداشت. حالا با Go 1.27، خود متدها میتونن type parameter مستقل داشته باشن:
// حالا فقط یه متد generic برای همهی انواع صحیح کافیه
func (r *Rand) N[Int intType](n Int) Int
این یعنی قابلیتهای generic میتونن مستقیم تو namespace یه نوع خاص زندگی کنن، بدون نیاز به تعریف یه تابع generic جدا تو سطح package.
دو تا تغییر زبانی دیگه هم اومده: تو composite literal های struct، حالا کلید میتونه هر field selector معتبری باشه (یعنی میشه مستقیم به فیلدهای تودرتو یا embedded دسترسی داشت)، و function type inference هم گسترش پیدا کرده تا هر جایی که یه تابع generic به یه نوع تابع تطبیقشده assign یا تبدیل میشه، کار کنه.
encoding/json/v2: نسل جدید JSON
یکی از بزرگترین تغییرات کتابخونهی استاندارد، اومدن encoding/json/v2 و encoding/json/jsontext بهعنوان پکیجهای جدیده. نکتهی مهم اینه که خود پکیج قدیمی encoding/json هم از این به بعد زیر پوستش از پیادهسازی v2 استفاده میکنه؛ یعنی اکثر تیمها لازم نیست import path شون رو عوض کنن، ولی رفتار زیرینش تغییر کرده.
v2 چند تا پیشفرض سختگیرانهتر داره: UTF-8 نامعتبر تو رشتهها حالا رد میشه، و کلیدهای تکراری تو یه JSON object هم رد میشن. این نکته مهمه اگه کدبیست تا الان (عمدی یا غیرعمدی) اینجور دادههای ناقص رو تحمل میکرده؛ حتی اگه مستقیم سراغ API جدید نری، متن پیام خطاها ممکنه عوض شده باشه، چون v1 حالا از داخل v2 قدرت میگیره.
از نظر performance، سرعت Marshal تقریباً همسطح پیادهسازی قبلیه، ولی Unmarshal بهطور محسوسی سریعتر شده.
بهبودهای Runtime
تخصیص حافظهی سریعتر: کامپایلر حالا برای تخصیصهای کوچیک (زیر ۸۰ بایت)، فراخوانیهایی به روتینهای تخصیص size-specialized تولید میکنه؛ این کار هزینهی بعضی از این تخصیصها رو تا ۳۰ درصد کم میکنه. طبق گزارشها، بهبود کلی رو برنامههای واقعی و allocation-heavy حدود ۱ درصده، با هزینهی حدود ۶۰ کیلوبایت حجم اضافهی باینری.
پروفایل نشتی goroutine: قابلیتی که بهصورت آزمایشی تو Go 1.26 معرفی شده بود، حالا به یه پروفایل رسمی تبدیل شده. پکیج runtime/pprof الان یه پروفایل goroutineleak داره که با اجرای یه چرخهی garbage collection، goroutine هایی که برای همیشه بلاک شدن رو شناسایی میکنه؛ ابزار مفیدی برای دیباگ کردن نشتیهای goroutine تو production.
SIMD: از amd64 به arm64 و WebAssembly
پشتیبانی آزمایشی SIMD که از Go 1.26 تو پکیج simd/archsimd شروع شده بود، تو این نسخه گسترش پیدا کرده. علاوه بر بازنگری API مربوط به amd64، حالا از SIMD ۱۲۸ بیتی «Neon» رو arm64 و SIMD ۱۲۸ بیتی رو WebAssembly هم پشتیبانی میشه. این پکیج با فعال کردن متغیر محیطی GOEXPERIMENT=simd موقع build در دسترسه، ولی API ش هنوز پایدار در نظر گرفته نمیشه. یه پکیج جدید دیگه هم به اسم simd معرفی شده که پشتیبانی SIMD قابلحمل و مستقل از سایز بردار ارائه میده؛ رو سختافزارهایی که دسترسی دارن، به دستورات vector واقعی کامپایل میشه و رو بقیه، به emulation خالص Go برمیگرده.
کتابخونهی استاندارد: چند تا اضافهی کاربردی
پکیج uuid: حالا تولید و parse کردن UUID مستقیم تو کتابخونهی استاندارده؛ دیگه نیازی به یه dependency خارجی برای این کار رایج نیست.
crypto/mldsa: پشتیبانی از یه الگوریتم امضای دیجیتال پسا-کوانتومی (ML-DSA) به کتابخونهی استاندارد کریپتوگرافی اضافه شده؛ گامی مهم برای آمادهسازی کدبیسها در برابر تهدید کامپیوترهای کوانتومی.
CutLast: یه تابع جدید که یه slice بایت رو حول آخرین رخداد یه جداکننده برش میده (برخلاف Cut معمولی که اولین رخداد رو در نظر میگیره).
Toolchain و ابزارها
go mod tidy هوشمندتر: برای ماژولهایی که رو Go 1.27 یا بالاتر هستن، این دستور حالا بلوکهای require پراکنده رو تو دو بلوک استاندارد (یکی برای وابستگی مستقیم، یکی غیرمستقیم) ادغام میکنه، در حالی که کامنتهای ضمیمهشده رو هم حفظ میکنه.
go tool trace امنتر: وقتی فقط یه پورت مشخص کنی، رابط trace حالا فقط رو localhost گوش میده، هماهنگ با رفتار go tool pprof؛ برای گوش دادن گستردهتر، باید صراحتاً یه آدرس مشخص بدی.
حذف پشتیبانی Bazaar: دستور go دیگه از سیستم کنترل نسخهی Bazaar (bzr) پشتیبانی نمیکنه.
پشتیبانی Response file: ابزارهای compile، link، asm، cgo، cover، و pack حالا از response file (با فرمت سازگار با GCC) پشتیبانی میکنن؛ کمک بزرگی برای سیستمهای build ای که به محدودیت طول خط فرمان برخورد میکنن.
بهبودهای go fix: این دستور modernizer های جدیدی گرفته که کمک میکنن کد قدیمیتر رو به الگوهای مدرنتر Go آپدیت کنی.
تغییرات پلتفرم
طبق گزارشها، این نسخه الزامات پلتفرمی برای macOS رو هم تغییر داده (جزئیات دقیق تو یادداشتهای رسمی release اومده)، پس اگه رو مک کار میکنی، قبل از آپگرید، حتماً حداقل نسخهی موردنیاز رو چک کن.
چطور همین الان امتحانش کنیم
باینریها و نصبکنندههای Go 1.27 از صفحهی دانلود رسمی (go.dev/dl) در دسترسن. اگه از JetBrains GoLand استفاده میکنی، نسخهی 2026.2 همین الان از ویژگیهای زبانی جدید، modernizer های go fix، و پروفایل جدید goroutine leak پشتیبانی میکنه. تیم Go هم بیستوپنجم آگوست، از ساعت ۱۶:۰۰ تا ۱۷:۳۰ به وقت UTC، یه «Go 1.27 Release Party» آنلاین برگزار میکنه که میشه توش با جزئیات بیشتر این تغییرات آشنا شد.
جمعبندی
Go 1.27 با حدود ۱۶۰۰ کامیت بین این نسخه و Go 1.26، یکی از نسخههایییه که واقعاً چیزی فراتر از بهبودهای معمولی نگهداری داره. متدهای generic، نسل جدید JSON، و بهبود چشمگیر تخصیص حافظه، همه چیزهایی هستن که مستقیم رو کد روزمرهی خیلی از تیمها تأثیر میذارن. با این حال، بهخاطر تغییر پیشفرضهای سختگیرانهی JSON v2 (رد کردن UTF-8 نامعتبر و کلیدهای تکراری)، قبل از آپگرید پروژههای production، ارزش داره تستهات رو کامل اجرا کنی تا مطمئن بشی دادهی ورودیت با این استانداردهای جدید مشکلی نداره.
