تغییرات جدید Go 1.26 | بررسی کامل نسخه جدید گولنگ

نویسنده

پوریا باباعلی

24 آذر 1404
30 دقیقه مطالعه

تو این مقاله، مهم ترین تغییرات Go 1.26 رو خیلی خودمونی و کاربردی مرور میکنیم؛ از قابلیت جدید new، تا GC جدید Green Tea، بهبودهای سرعت، ابزارهای پروفایل، و تغییرات مهم استاندارد لایبرری و پورت ها.

تصویر مقاله

Go 1.26 چی آورده؟ یه مقاله خیلی مفصل و خودمونی از تغییرات (پیش نویس Release Notes)

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


فهرست

  1. یه جمع بندی خیلی سریع
  2. تغییرات زبان
  3. Tools
    • Go command
    • pprof
  4. Runtime
    • GC جدید Green Tea
    • cgo سریع تر
    • malloc سریع تر برای سایزهای کوچیک
    • پروفایل نشت goroutine
  5. Compiler
  6. Linker
  7. Bootstrap
  8. Standard Library
    • پکیج جدید crypto/hpke
    • پکیج آزمایشی simd/archsimd
    • پکیج آزمایشی runtime/secret
    • تغییرات ریز ولی مهم تو کتابخونه ها
  9. Ports
  10. چک لیست مهاجرت و نکات عملی

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}

مشکل کجاست؟

  • ch unbuffered هست
  • اگه وسط کار یه ارور بیاد و زود 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 و PrivateKey deprecated شدن

یه تغییر مهم تو crypto/ecdh:

  • interface جدید KeyExchanger اضافه شده که PrivateKey پیاده سازیش میکنه
  • کاربرد: قبول کردن ECDH private key به شکل abstract، مثلاً کلیدی که تو hardware نگه داری میشه

crypto/ed25519

یه تغییر ظریف ولی مهم:

  • اگه پارامتر random به GenerateKey nil باشه، دیگه از 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 اضافه شدن و interface crypto.Decapsulator رو پوشش میدن
  • تو crypto/mlkem/mlkemtest توابع Encapsulate768 و Encapsulate1024 اضافه شدن برای derandomized encapsulation جهت known-answer test

crypto/rsa

چند تغییر:

  • EncryptOAEPWithOptions اضافه شده که میتونی hash OAEP و hash MGF1 رو جداگانه مشخص کنی
  • تغییر رفتار validate:
    • اگه بعد از PrivateKey.Precompute فیلدهای کلید رو دستکاری کنی، PrivateKey.Validate fail میشه
    • PrivateKey.D هم برای سازگاری با precomputed values چک میشه

و یه هشدار جدی:

  • padding ناامن PKCS #1 v1.5 برای encryption deprecated شده:
    • EncryptPKCS1v15
    • DecryptPKCS1v15
    • DecryptPKCS1v15SessionKey

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 زیر فعال شدن پیش فرض:
    • SecP256r1MLKEM768
    • SecP384r1MLKEM1024
  • میشه خاموشش کرد با:
    • Config.CurvePreferences
    • یا GODEBUG=tlssecpmlkem=0

دو تا فیلد جدید برای HelloRetryRequest:

  • ClientHelloInfo.HelloRetryRequest
  • ConnectionState.HelloRetryRequest

برای QUIC:

  • QUICConn یه event جدید برای گزارش TLS handshake error ها داره

بهبود استفاده از signer:

  • اگه Certificate.PrivateKey interface crypto.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.2
  • tls3des: 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:generate
  • BasicLit.ValueEnd اضافه شده که end position literal دقیق ثبت بشه و BasicLit.End همیشه درست دربیاد
    • قبلاً تو raw string های چند خطی تو Windows ممکن بود اشتباه بشه چون carriage return ها حذف میشدن نکته: اگه خودت AST رو دستکاری میکنی و ValuePos رو تغییر میدی، شاید لازم باشه ValueEnd رو هم آپدیت کنی یا پاکش کنی.

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 یه سری متد جدید گرفته:

  • DialIP
  • DialTCP
  • DialUDP
  • DialUnix

که اجازه میدن 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.Director deprecated شده
  • به جاش 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_OVERLAPPED
  • FILE_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.ArtifactDir
  • B.ArtifactDir
  • F.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 و کتابخونه ها حالتو خوب میکنه.

نظرات

کدهالیک

کدهالیک پلتفرمی برای یادگیری زبان‌های برنامه‌نویسی است. ما با ارائه دوره‌های کاربردی و پروژه‌محور، شما را در مسیر تبدیل شدن به یک برنامه‌نویس حرفه‌ای همراهی می‌کنیم. از مبتدی تا پیشرفته، با کدهالیک آینده‌ی شغلی خود را بسازید.

لینک‌های سریع

ارتباط با ما

mail@codehalic.ir

چیتگر جوزانی غربی خیابان مظفر خیابان زنبق پلاک صفر برج همت یاس

02146021206 - 09100455680

© 1405 کدهالیک™ - تمامی حقوق محفوظ است