Go 1.26 چی آورده؟ یه مقاله خیلی مفصل و خودمونی از تغییرات (پیش نویس Release Notes)
اینا فعلاً پیش نویسه و Go 1.26 هنوز نهایی نشده. طبق چیزی که گفتن، احتمالاً فوریه 2026 منتشر میشه.
فهرست
- یه جمع بندی خیلی سریع
- تغییرات زبان
- Tools
- Go command
- pprof
- Runtime
- GC جدید Green Tea
- cgo سریع تر
- malloc سریع تر برای سایزهای کوچیک
- پروفایل نشت goroutine
- Compiler
- Linker
- Bootstrap
- Standard Library
- پکیج جدید crypto/hpke
- پکیج آزمایشی simd/archsimd
- پکیج آزمایشی runtime/secret
- تغییرات ریز ولی مهم تو کتابخونه ها
- Ports
- چک لیست مهاجرت و نکات عملی
1) جمع بندی خیلی سریع
اگه بخوام خیلی خلاصه بگم، Go 1.26 یه آپدیت از اون مدل هاست که هم تو کارایی و هم تو ابزارها دست میبره، یعنی:
- یه تغییر خوشگل تو زبان:
newحالا میتونه مقدار اولیه رو مستقیم بگیره - ابزارها:
go tool docحذف شده وgo fixجدی تر شده - پروفایل و دیباگ: UI جدید pprof پیش فرضش flame graph شده
- runtime: GC جدید به اسم Green Tea پیش فرض شده، cgo سریع تر شده، malloc برای سایزهای کوچیک بهینه تر شده
- یه قابلیت خفن برای شکار goroutine leak اومده (فعلاً آزمایشی)
- استاندارد لایبرری هم کلی تغییر ریز داره، مخصوصاً تو crypto و net/http و reflect و io و اینا
- پورت ها: یه سری خداحافظی ها و یه سری تغییر وضعیت
2) تغییرات زبان
2.1) new حالا expression میگیره
قبلاً new(T) فقط یه اشاره گر به مقدار صفر T میداد. الان میتونی بگی:
- یه expression حساب کن
- خروجیش رو بریز تو یه متغیر تازه
- و اشاره گرش رو بهم بده
این خیلی تو سناریوهای optional field به سبک pointer نجاتت میده. مخصوصاً تو JSON و protobuf که هی میخوای *int یا *bool بسازی و نمیخوای سه خط کد اضافه بزنی.
نمونه:
1import "encoding/json" 2 3type Person struct { 4 Name string `json:"name"` 5 Age *int `json:"age"` // اگه معلوم بود مقدار داره، وگرنه nil 6} 7 8func personJSON(name string, born time.Time) ([]byte, error) { 9 return json.Marshal(Person{ 10 Name: name, 11 Age: new(yearsSince(born)), 12 }) 13} 14 15func yearsSince(t time.Time) int { 16 return int(time.Since(t).Hours() / (365.25 * 24)) // تقریبی 17}
نکته خودمونی: این یکی از اون تغییرای کوچیکه که وقتی وارد کدت میشه حس میکنی چندتا تیکه کد اضافه از زندگی حذف شد.
3) Tools
3.1) Go command
3.1.1) go tool doc و cmd/doc حذف شدن
دیگه cmd/doc و go tool doc نداریم. جایگزینش go doc هست.
خلاصه اش اینه که اگه جایی اسکریپت یا عادتت این بود:
go tool doc fmtاز این به بعد بزن:go doc fmt
پرچم ها و آرگومان ها هم همون مدله، یعنی خیلی قرار نیست دردسر بشه، فقط باید یادت بمونه اون یکی دیگه وجود نداره.
3.1.2) go fix بالاخره از خواب بیدار شد
go fix الان از Go analysis framework استفاده میکنه (golang.org/x/tools/go/analysis).
یعنی چی؟
یعنی همون مدل analyzer هایی که go vet میتونه باهاش تشخیص بده، حالا میتونن پیشنهاد fix بدن و go fix هم میتونه اون fix رو اعمال کنه.
یه نتیجه مهم:
- fixer های قدیمی
go fixکه عملاً منسوخ شده بودن حذف شدن - به جاش یه سری analyzer جدید اومدن که کمک میکنن کد رو با فیچرها و API های جدیدتر آپدیت کنی
نکته عملی: اگه پروژه بزرگ داری و میخوای کم کم مدرنش کنی، go fix تو این نسخه میتونه تبدیل بشه به یه دوست پرحرف ولی مفید.
3.2) pprof
3.2.1) UI پیش فرض: Flame graph
وقتی pprof رو با -http بالا میاری، پیش فرضش دیگه اون graph قدیمی نیست. flame graph شده پیش فرض.
- graph قدیمی هنوز هست
- از منوی View گزینه Graph
- یا مستقیم مسیر
/ui/graph
نکته خودمونی: flame graph برای خیلی از آدم ها سریع تر جواب میده چون مستقیم میبینی چی داره زمان میخوره و استک ها چجوری روی هم افتادن.
4) Runtime
اینجا جاییه که Go معمولاً بی سر و صدا کلی کار میکنه و بعد تو برنامه واقعی تو میبینی همه چیز نرم تر شده.
4.1) GC جدید: Green Tea (پیش فرض شد)
GC ای که تو Go 1.25 آزمایشی بود، الان تو 1.26 پیش فرض شده.
ایده اصلیش:
- mark و scan کردن آبجکت های کوچیک رو با locality بهتر انجام بده
- روی CPU بهتر scale کنه
- تو بعضی CPU های جدیدتر amd64 از vector instruction ها برای scan کردن کمک بگیره
طبق چیزی که تو ریلیز نوت گفتن:
- سربار GC تو برنامه های واقعی که شدیداً GC مصرف میکنن ممکنه حدود 10 تا 40 درصد کمتر بشه
- روی CPU های جدیدتر مثل Intel Ice Lake یا AMD Zen 4 و جدیدتر، یه بهبود اضافه هم ممکنه ببینی (گفتن حدود 10 درصد بهبود بیشتر در overhead GC)
اگه به هر دلیلی نخواستی:
- میتونی موقع build اینو ست کنی:
GOEXPERIMENT=nogreenteagc
ولی یه نکته: گفتن احتمالاً این opt out تو Go 1.27 برداشته میشه. یعنی بهتره اگه خاموشش میکنی، دقیق بدونی چرا و اگه باگ یا مشکل دیدی issue ثبت کنی.
4.2) cgo سریع تر شد
سربار پایه runtime برای cgo call ها حدود 30 درصد کمتر شده.
این یعنی اگه پروژه ای داری که بین Go و C هی رفت و برگشت میکنه، یه مقدار از اون هزینه رفت و برگشت کم میشه.
نکته خودمونی: این تغییر قرار نیست کدت رو ناگهان موشکی کنه، ولی تو برنامه هایی که هزاران بار در ثانیه cgo صدا میزنن، میتونه واقعاً محسوس باشه.
4.3) malloc سریع تر برای سایزهای کوچیک
کامپایلر حالا میتونه برای allocation های کوچیک، call های مخصوص سایزهای خاص تولید کنه. گفتن:
- برای بعضی allocation های کوچیک زیر 512 بایت، هزینه تا 30 درصد کمتر میشه
- تو کل workload های allocation heavy، انتظار بهبود کلی حدود 1 درصد دادن
اگه خواستی خاموشش کنی:
GOEXPERIMENT=nosizespecializedmalloc
اینم مثل همیشه: اگه regression دیدی، بهتره گزارش بدی.
4.4) پروفایل نشت goroutine (فعلاً آزمایشی ولی خیلی کاربردی)
یه نوع پروفایل جدید اومده که goroutine های لیک شده رو گزارش میده. اسم پروفایل:
goroutineleakتوruntime/pprof
فعلاً آزمایشی و باید موقع build فعالش کنی:
GOEXPERIMENT=goroutineleakprofile
وقتی فعال شد:
- یه endpoint جدید هم تو net/http/pprof میاد بالا:
/debug/pprof/goroutineleak
حس و حال این قابلیت:
- خیلی وقت ها goroutine leak داری ولی پیدا کردنش سخته چون اون channel یا mutex یا cond که روش گیر کردن، از دید goroutine های runnable دیگه قابل دسترسی نیست و عملاً "تو خلأ" گیر کردن.
- این قابلیت میاد goroutine هایی که روی primitive های concurrency گیر کردن و از runnable ها reachable نیستن رو شناسایی میکنه.
یه مثال کلاسیک از لیک:
1type result struct { 2 res workResult 3 err error 4} 5 6func processWorkItems(ws []workItem) ([]workResult, error) { 7 ch := make(chan result) 8 for _, w := range ws { 9 go func() { 10 res, err := processWorkItem(w) 11 ch <- result{res, err} 12 }() 13 } 14 15 var results []workResult 16 for range len(ws) { 17 r := <-ch 18 if r.err != nil { 19 return nil, r.err 20 } 21 results = append(results, r.res) 22 } 23 return results, nil 24}
مشکل کجاست؟
chunbuffered هست- اگه وسط کار یه ارور بیاد و زود return کنی، goroutine های باقی مونده روی
ch <- ...گیر میکنن و هیچکس دیگه نیست که ازchبخونه - نتیجه: لیک
نکته مهم:
- این سیستم ممکنه لیک هایی که از global variable ها یا از local های goroutine های runnable قابل دسترسی هستن رو نتونه خوب تشخیص بده، چون اونجا از نظر reachability داستان فرق میکنه.
گفتن:
- پیاده سازی production ready هست
- آزمایشی بودنش بیشتر به خاطر API و شکل ارائه است (اینکه به عنوان profile جدید باشه)
و برنامه آینده:
- هدف اینه تو Go 1.27 پیش فرض فعالش کنن
5) Compiler
5.1) slice backing store بیشتر روی stack میره
کامپایلر تو موقعیت های بیشتری میتونه backing array بعضی slice ها رو روی stack بذاره. نتیجه:
- کمتر heap allocation
- فشار کمتر به GC
- عملکرد بهتر تو بعضی hot path ها
اگه یه جایی این تغییر اذیتت کرد:
- ابزار bisect میتونه کمک کنه
- گفتن با فلگ
-compile=variablemakeمیشه allocation مشکل ساز رو پیدا کرد - و میشه این stack allocation های جدید رو خاموش کرد با:
-gcflags=all=-d=variablemakehash=n
نکته خودمونی: اینا از اون تغییراییه که 90 درصد مواقع فقط سود میدی، 10 درصد مواقع ممکنه تو یه کد عجیب یا edge case دردسر بسازه.
6) Linker
6.1) windows/arm64 و internal linking برای cgo
روی Windows arm64، linker حالا internal linking mode برای cgo برنامه ها رو ساپورت میکنه. درخواستش:
-ldflags=-linkmode=internal
6.2) تغییرات ریز تو فایل های اجرایی
این تغییرات روی اجرا اثر ندارن، ولی اگه ابزار تحلیل باینری نوشتی یا از external linking با اسکریپت های خاص استفاده میکنی، باید حواست باشه.
چیزایی که گفتن:
moduledataرفته تو section جدا به اسمgo.module- طول slice مربوط به
moduledata cutabدرست شده (قبلاً 4 برابر اشتباه بود) pcHeaderتو.gopclntabدیگه start text section رو ثبت نمیکنه و همیشه صفره- نتیجه این تغییر اینه که
.gopclntabدیگه relocation نداره و روی سیستم هایی با relro، از relro segment رفته rodata funcdataوfindfunctabاز.rodataرفتن.gopclntab.gosymtabحذف شده (قبلاً بود ولی خالی بود)- تو internal linking، section های ELF تو section header list بر اساس آدرس مرتب میشن
نکته پلتفرمی:
- اسم section ها تو ELF همونیه که تو Linux میبینی
- تو Darwin (Mach-O) اسم ها با
__شروع میشن و نقطه ندارن
7) Bootstrap
Go 1.26 برای bootstrap نیاز داره:
- Go 1.24.6 یا جدیدتر
و گفتن:
- احتمالاً Go 1.28 نیاز داره به یه minor release از Go 1.26 یا جدیدتر برای bootstrap
نکته عملی: اگه تو شرکت یا تیم یه pipeline قدیمی داری که هنوز با Go قدیمی bootstrap میکنه، بهتره از الان چکش کنی که گیر نکنی.
8) Standard library
اینجا هم یه بخش باحال داریم، هم یه بخش پر از تغییرات ریز که بعضیاشون خیلی اثرگذار میشن.
8.1) پکیج جدید crypto/hpke
پکیج جدید crypto/hpke پیاده سازی HPKE هست طبق RFC 9180.
گفتن:
- شامل پشتیبانی از post-quantum hybrid KEM ها هم هست
اگه با TLS، پروتکل های امن، یا رمزنگاری سطح اپلیکیشن سروکار داری، این یکی میتونه خیلی به کارت بیاد.
8.2) پکیج آزمایشی simd/archsimd
یه پکیج آزمایشی جدید:
simd/archsimd
فعال سازی:
GOEXPERIMENT=simd
فعلاً:
- فقط AMD64
- وکتور 128، 256، 512 بیت
حس و حالش:
- اگه داری کار پردازشی سنگین میکنی، مثل encoding، hashing خاص، پردازش تصویر یا دیتای باینری، این میتونه در آینده یه در باز کنه که بدون رفتن به assembly یا cgo، مستقیم SIMD بزنی.
- ولی چون آزمایشیه، باید با احتیاط بری سمتش.
8.3) پکیج آزمایشی runtime/secret
پکیج جدید:
runtime/secret
فعال سازی:
GOEXPERIMENT=runtimesecret
کارش چیه؟
- یه سازوکار برای پاک کردن امن temporary هایی که تو کدی که با اطلاعات حساس کار میکنه ساخته میشن، مثل کدهای cryptographic.
فعلاً:
- Linux روی AMD64 و ARM64
تابع مهم:
secret.Do(fn)
رفتارش:
fnرو اجرا میکنه- بعدش temporary storage هایی که اون fn استفاده کرده رو پاک میکنه:
- رجیسترها
- stack
- heap allocation های جدید
- نکته: heap تا وقتی unreachable نشه و GC جمعش نکنه، کامل پاک نمیشه و این ممکنه یه مدت طول بکشه
هدفش:
- راحت تر کردن forward secrecy
- اینکه کمتر استرس داشته باشی "یه تکه کلید یا secret تو حافظه مونده"
نکته خودمونی: این از اون چیزاست که آدم وقتی امنیت براش مهمه، دلش میخواد یه ابزار استاندارد داشته باشه، نه اینکه هرکی خودش یه hack بزنه.
8.4) تغییرات ریز ولی مهم تو کتابخونه ها
این بخش رو دسته بندی میکنم که راحت تر بشه.
bytes
Buffer.Peek
یه متد جدید:
Buffer.Peek(n)که n بایت بعدی رو میده بدون اینکه بافر رو جلو ببره.
کاربردش: parser ها، پروتکل ها، جاهایی که میخوای نگاه کنی ببینی چی میاد ولی هنوز مصرفش نکنی.
crypto (عمومی)
Interface های جدید: Encapsulator و Decapsulator
این دوتا interface اضافه شدن که بتونی کلیدهای encapsulation/decapsulation رو به شکل abstract قبول کنی. به درد جاهایی میخوره که implementation ممکنه نرم افزاری نباشه یا مدل های مختلف کلید داری.
crypto/dsa, crypto/ecdh, crypto/ecdsa, crypto/rand, crypto/rsa
یه الگوی مشترک اینجاست:
- پارامتر
randomتو خیلی از توابع دیگه نادیده گرفته میشه - به جاش همیشه از یه منبع امن randomness استفاده میکنن
برای تست deterministic:
- باید از
testing/cryptotest.SetGlobalRandomاستفاده کنی
برای برگردوندن موقت رفتار قدیمی:
GODEBUG=cryptocustomrand=1
جزئیات مهم:
crypto/dsa.GenerateKey: پارامتر random نادیده گرفته میشهcrypto/ecdh.Curve.GenerateKey: پارامتر random نادیده گرفته میشهcrypto/ecdsa.GenerateKeyوSignوSignASN1وPrivateKey.Sign: random نادیده گرفته میشهcrypto/rand.Prime: random نادیده گرفته میشهcrypto/rsa.GenerateKeyوGenerateMultiPrimeKeyوEncryptPKCS1v15: random نادیده گرفته میشه
یه تغییر مهم تو crypto/ecdsa:
- فیلدهای
big.IntتوPublicKeyوPrivateKeydeprecated شدن
یه تغییر مهم تو crypto/ecdh:
- interface جدید
KeyExchangerاضافه شده کهPrivateKeyپیاده سازیش میکنه - کاربرد: قبول کردن ECDH private key به شکل abstract، مثلاً کلیدی که تو hardware نگه داری میشه
crypto/ed25519
یه تغییر ظریف ولی مهم:
- اگه پارامتر random به
GenerateKeynil باشه، دیگه ازcrypto/rand.Readerقابل override استفاده نمیکنه و همیشه از منبع امن استفاده میکنه - برای برگشت به رفتار قدیمی:
GODEBUG=cryptocustomrand=1
crypto/fips140
تو مود GODEBUG=fips140=only:
- تابع های
WithoutEnforcementوEnforcedاومدن که بتونی خیلی کنترل شده بعضی چک های سختگیرانه FIPS 140-3 رو خاموش و روشن کنی
یه مورد دیگه:
Versionنسخه resolved ماژول کریپتو رو وقتی با GOFIPS140 روی frozen module build میکنی برمیگردونه
crypto/mlkem و crypto/mlkem/mlkemtest
- تو
crypto/mlkemمتدهایEncapsulatorبرایDecapsulationKey768وDecapsulationKey1024اضافه شدن و interfacecrypto.Decapsulatorرو پوشش میدن - تو
crypto/mlkem/mlkemtestتوابعEncapsulate768وEncapsulate1024اضافه شدن برای derandomized encapsulation جهت known-answer test
crypto/rsa
چند تغییر:
EncryptOAEPWithOptionsاضافه شده که میتونی hash OAEP و hash MGF1 رو جداگانه مشخص کنی- تغییر رفتار validate:
- اگه بعد از
PrivateKey.Precomputeفیلدهای کلید رو دستکاری کنی،PrivateKey.Validatefail میشه PrivateKey.Dهم برای سازگاری با precomputed values چک میشه
- اگه بعد از
و یه هشدار جدی:
- padding ناامن PKCS #1 v1.5 برای encryption deprecated شده:
EncryptPKCS1v15DecryptPKCS1v15DecryptPKCS1v15SessionKey
crypto/subtle
WithDataIndependentTiming تغییر کرده:
- دیگه goroutine رو به OS thread قفل نمیکنه وقتی fn رو اجرا میکنه
- goroutine هایی که داخل اون fn ساخته میشن و نسل های بعدیشون، این خاصیت data independent timing رو برای عمرشون inherit میکنن
اثر روی cgo هم داره:
- اگه از داخل
WithDataIndependentTimingیا goroutine های ساخته شده در اون، cgo call بزنی، کد C هم data independent timing رو برای مدت call خواهد داشت - اگه کد C خودش این حالت رو disable کنه، وقتی برگردی Go دوباره enable میشه
- اگه کد C (از هرجایی) data independent timing رو تغییر بده و بعد وارد Go بشه، اون state برای مدت call حفظ میشه
crypto/tls
چندتا تغییر مهم:
- key exchange های hybrid post-quantum زیر فعال شدن پیش فرض:
SecP256r1MLKEM768SecP384r1MLKEM1024
- میشه خاموشش کرد با:
Config.CurvePreferences- یا
GODEBUG=tlssecpmlkem=0
دو تا فیلد جدید برای HelloRetryRequest:
ClientHelloInfo.HelloRetryRequestConnectionState.HelloRetryRequest
برای QUIC:
QUICConnیه event جدید برای گزارش TLS handshake error ها داره
بهبود استفاده از signer:
- اگه
Certificate.PrivateKeyinterfacecrypto.MessageSignerرو پیاده کنه، تو TLS 1.2 به بعد ازSignMessageاستفاده میشه به جایSign
و یه نکته درباره آینده: یه سری GODEBUG ها که از Go 1.22 و 1.23 اومده بودن، گفتن تو major بعدی حذف میشن و از Go 1.27 به بعد رفتار جدید همیشه اعمال میشه:
tlsunsafeekm: ExportKeyingMaterial نیازمند TLS 1.3 یا Extended Master Secret میشهtlsrsakex: RSA-only key exchange های قدیمی بدون ECDH دیگه پیش فرض فعال نیستنtls10server: حداقل TLS پیش فرض برای client و server میشه TLS 1.2tls3des: 3DES از cipher suite های پیش فرض میره بیرونx509keypairleaf: Leaf همیشه populate میشه
crypto/x509
چندتا تغییر API خوشگل:
ExtKeyUsageوKeyUsageحالاString()دارن که اسم OID ها رو بر اساس RFC 5280 و رجیستری های مرتبط میدنExtKeyUsage.OID()اضافه شده که OID رو میدهOIDFromASN1OIDاضافه شده برای تبدیلencoding/asn1.ObjectIdentifierبهOID
debug/elf
یه سری constant جدید R_LARCH_* برای LoongArch اضافه شده (طبق psABI v20250521 و v2.40).
errors
AsType
یه نسخه generic و type-safe از As اضافه شده:
- سریع تر
- type-safe
- معمولاً تمیزتر تو کد
fmt
بهبود ریز ولی خوب:
fmt.Errorf("x")برای string های بدون formatting allocation کمتری میکنه و شبیهerrors.New("x")میشه
go/ast
دو تغییر:
ParseDirectiveاضافه شده برای پارس کردن directive comment ها مثل//go:generateBasicLit.ValueEndاضافه شده که end position literal دقیق ثبت بشه وBasicLit.Endهمیشه درست دربیاد- قبلاً تو raw string های چند خطی تو Windows ممکن بود اشتباه بشه چون carriage return ها حذف میشدن
نکته: اگه خودت AST رو دستکاری میکنی و
ValuePosرو تغییر میدی، شاید لازم باشهValueEndرو هم آپدیت کنی یا پاکش کنی.
- قبلاً تو raw string های چند خطی تو Windows ممکن بود اشتباه بشه چون carriage return ها حذف میشدن
نکته: اگه خودت AST رو دستکاری میکنی و
go/token
File.Endاضافه شده برای گرفتن end position فایل
go/types
گفتن GODEBUG=gotypesalias که تو Go 1.22 اومده بود، تو major بعدی حذف میشه.
از Go 1.27 به بعد، go/types همیشه type alias رو با Alias representation تولید میکنه، مستقل از GODEBUG یا زبان go.mod.
image/jpeg
encoder و decoder JPEG عوض شدن:
- سریع تر
- دقیق تر ولی اگه کدت روی خروجی bit-for-bit حساسه، ممکنه مجبور شی تست هات رو آپدیت کنی.
io
ReadAll بهتر شده:
- intermediate memory کمتر
- slice نهایی حداقل اندازه لازم
- گفتن خیلی وقت ها حدود 2 برابر سریع تره و معمولاً نصف allocate قبلی رو هم انجام میده، مخصوصاً تو ورودی های بزرگ
log/slog
NewMultiHandler
یه handler چندتایی میسازه که چندتا handler رو همزمان صدا میزنه. رفتارش:
Enabled: اگه هرکدوم enabled باشن true میدهHandle,WithAttr,WithGroup: روی هر handler فعال اجرا میشه
net
Dialer یه سری متد جدید گرفته:
DialIPDialTCPDialUDPDialUnix
که اجازه میدن network type مشخص رو با context بزنی.
net/http
دو تغییر مهم:
HTTP2Config.StrictMaxConcurrentRequests: کنترل میکنه اگه یه کانکشن HTTP/2 از stream limit رد شد، آیا کانکشن جدید باز بشه یا نهTransport.NewClientConn: یه client conn میده برای زمانی که میخوای خودت connection management انجام بدی- ولی برای اکثر آدم ها، همون
Transport.RoundTripبهترینه چون pool رو خودش مدیریت میکنه
- ولی برای اکثر آدم ها، همون
net/http/httptest
تغییر خوشحال کننده برای تست:
- کلاینتی که
Server.Client()میده، حالا request هایexample.comو زیردامنه هاش رو redirect میکنه به همون سرور تست این باعث میشه تو تست ها کمتر درگیری DNS و ریزه کاری ها رو داشته باشی.
net/http/httputil
یه موضوع امنیتی مهم:
ReverseProxy.Directordeprecated شده- به جاش
ReverseProxy.Rewriteتوصیه شده
علتش:
- client مخرب میتونه header هایی که Director اضافه کرده رو با hop-by-hop کردن حذف کنه
- این مشکل تو چارچوب Director درست حسابی حل نمیشه
- Rewrite از Go 1.20 اضافه شده بود و الان مسیر درست همونه
net/netip
Prefix.Compareاضافه شده برای مقایسه prefix ها
net/url
Parse سختگیرتر شده:
- URL های خراب با colon اضافی تو host رو reject میکنه
- مثل
http://::1/یاhttp://localhost:80:80/
- مثل
- IPv6 درست با bracket هنوز قبوله:
- مثل
http://[::1]/
- مثل
برای برگشت به رفتار قدیمی:
GODEBUG=urlstrictcolons=0
os
Process.WithHandle
یه API جدید برای گرفتن handle داخلی پروسه روی پلتفرم های پشتیبانی شده:
- Linux 5.4 به بعد (pidfd)
- Windows
اگه پشتیبانی نشه:
ErrNoHandleمیده
Windows OpenFile
روی Windows، پارامتر flag تو OpenFile حالا میتونه ترکیب flag های مخصوص Windows رو هم داشته باشه مثل:
FILE_FLAG_OVERLAPPEDFILE_FLAG_SEQUENTIAL_SCAN
os/signal
NotifyContext حالا context رو با context.CancelCauseFunc cancel میکنه و یه error هم میده که نشون بده کدوم سیگنال اومده.
reflect
یه تغییر بزرگ و جالب:
Type.Fields,Type.Methods,Type.Ins,Type.Outsحالا iterator میدنValue.FieldsوValue.Methodsهم iterator میدن و هر iteration، اطلاعات type (مثلStructFieldیاMethod) رو همراه باValueمربوطه میده
نکته خودمونی: اگه reflection heavy هستی، این میتونه کدتو تمیزتر کنه و شاید یه جاهایی سریع تر هم بشه.
runtime/metrics
یه سری metric جدید برای scheduler اضافه شده:
- شمارش goroutine ها در حالت های مختلف زیر
/sched/goroutines - تعداد OS thread هایی که runtime میشناسه با
/sched/threads:threads - تعداد کل goroutine های ساخته شده با
/sched/goroutines-created:goroutines
این برای observability خیلی خوبه، مخصوصاً وقتی داری دنبال این میگردی که چرا یه سرویس زیر بار weird رفتار میکنه.
testing
سه تا متد جدید:
T.ArtifactDirB.ArtifactDirF.ArtifactDir
کارشون:
- یه پوشه میدن برای خروجی فایل های تست، مثل artifact هایی که میخوای نگه داری
با فلگ -artifacts تو go test:
- این directory میره زیر outputdir بدون اون:
- تو temp ساخته میشه و بعد تست پاک میشه
و اولین بار که ArtifactDir() رو صدا بزنی وقتی -artifacts فعاله، مسیر رو تو log چاپ میکنه مثل:
=== ARTIFACTS Test /path/to/artifact/dir
testing/cryptotest
SetGlobalRandomاضافه شده برای deterministic crypto randomness تو تست ها- روی
crypto/randو منابع implicit randomness تو پکیج های crypto/... اثر میذاره
time
گفتن GODEBUG=asynctimerchan که تو Go 1.23 معرفی شده بود، تو major بعدی حذف میشه.
از Go 1.27 به بعد:
- time package همیشه از channel های unbuffered (synchronous) برای timer ها استفاده میکنه، مستقل از GODEBUG یا go.mod language version.
9) Ports
Darwin
- Go 1.26 آخرین نسخه ایه که روی macOS 12 Monterey اجرا میشه
- Go 1.27 به macOS 13 Ventura یا جدیدتر نیاز داره
FreeBSD
- پورت
freebsd/riscv64(GOOS=freebsd GOARCH=riscv64) marked as broken شده
Windows
- پورت خراب
windows/arm(32-bit) حذف شده (قبلاً هم اعلام کرده بودن)
PowerPC
- Go 1.26 آخرین نسخه ایه که از
linux/ppc64(big-endian 64-bit) پشتیبانی میکنه - تو Go 1.27 این پورت حذف میشه
S390X
- پورت s390x حالا از پاس دادن آرگومان و نتیجه تابع با register پشتیبانی میکنه
10) چک لیست مهاجرت و نکات عملی
10.1) اگه روی ابزار doc تکیه داری
- هرجا
go tool docداری، تبدیلش کن بهgo doc
10.2) اگه برنامه ات GC heavy هست
- با Go 1.26 حتماً benchmark بگیر
- اگر دیدی عجیب شد، موقتاً میتونی با
GOEXPERIMENT=nogreenteagcخاموشش کنی - ولی بهتره مشکل رو دقیق دربیاری و گزارش بدی چون opt out احتمالاً موقتیه
10.3) اگه cgo زیاد میزنی
- یه دور performance test بگیر، احتمالاً یه بهبود خوب میبینی
- اگر عجیب شد، لاگ و پروفایل بگیر چون اینجا تغییراتش زیرپوستیه
10.4) اگر goroutine leak رو همیشه حدس میزدی ولی مدرک نداشتی
- یه build آزمایشی با
GOEXPERIMENT=goroutineleakprofileدرست کن - endpoint
goroutineleakرو بگیر و ببین کجاها گیر کردن - مخصوصاً جاهایی که early return داری یا context cancel داری یا fan-out/fan-in کانال داری
10.5) اگه ابزار تحلیل باینری داری
- تغییرات section ها و
.gopclntabو حذف.gosymtabرو در نظر بگیر - اگر چیزی رو از رو relocation یا header ها حدس میزدی، ممکنه باید آپدیتش کنی
10.6) اگر پروژه ات crypto حساسه
- تغییرات random parameter ها رو جدی بگیر
- اگر تست deterministic داشتی که random رو تزریق میکردی، احتمالاً باید مهاجرت کنی به
testing/cryptotest.SetGlobalRandom - deprecated شدن PKCS #1 v1.5 برای encryption رو هم به چشم یه چراغ قرمز نگاه کن و برنامه جایگزین داشته باش
10.7) اگر روی macOS 12 هستی
- اگر قرار داری تا یکی دو نسخه بعد هم آپدیت Go بدی، از الان برنامه ارتقای macOS رو بچین
حرف آخر
Go 1.26 از اون نسخه هاست که هم تو کد نویسی روزمره یه چیز کوچیک ولی دلنشین میده (new با مقدار اولیه)، هم زیر hood کلی چیز رو برای سرعت و observability بهتر میکنه. اگه یه سرویس واقعی داری که زیر بار کار میکنه، این نسخه بیشتر از اینکه با فیچرهای نمایشی سر و صدا کنه، با بهبودهای واقعی تو runtime و کتابخونه ها حالتو خوب میکنه.