Go 1.27, Ağustos 2026'da yayımlandı ve dile üç değişiklik getirdi: metotlar artık kendi tip parametrelerini tanımlayabiliyor (generic metotlar), struct literallerinde anahtar olarak gömülü alanların alanları da yazılabiliyor ve generic fonksiyonların tip çıkarımı tüm atama bağlamlarına genişletildi. Standart kütüphanede ise encoding/json/v2 ile encoding/json/jsontext paketleri, yeni uuid paketi, kuantum sonrası imza şeması ML-DSA için crypto/mldsa ve deneysel simd paketi en dikkat çekici eklemeler.
Sürüm notlarının ifadesiyle değişikliklerin çoğu araç zinciri, çalışma zamanı ve kütüphanelerin içinde; Go 1 uyumluluk sözü korunuyor ve neredeyse tüm programların önceki gibi derlenip çalışması bekleniyor. Bu yazıda yalnızca resmî Go 1.27 sürüm notlarında ve Go Blog duyurusunda geçen değişiklikleri, mümkün olanları Go 1.27.3 ile çalıştırarak anlatıyoruz. Bir önceki sürüm için Go 1.26 yenilikleri yazısına bakabilirsiniz.
Dil değişiklikleri özeti
| Değişiklik | Önce | Go 1.27 ile |
|---|---|---|
| Generic metotlar | yalnızca paket düzeyinde generic fonksiyon | metot kendi [F any] parametresini tanımlayabilir |
| Struct literal anahtarı | yalnızca üst düzey alan adı | geçerli herhangi bir alan seçici (gömülü alanın alanı) |
| Fonksiyon tip çıkarımı | bazı bağlamlarda açık tip argümanı gerekiyordu | eşleşen fonksiyon tipine her atamada çıkarım |
Bu özellikleri kullanabilmek için modülünüzün go.mod dosyasındaki go satırının en az 1.27 olması gerekir. Derleyici, dil sürümünü modül dosyasından okur ve daha eski bir değerde yeni söz dizimini reddeder; aşağıda bunun gerçek hata mesajını göreceksiniz.
Generic metotlar

Go 1.18'den beri generic tiplerin metotları vardı, ama bu metotlar yalnızca tipin kendi tip parametrelerini kullanabiliyordu; metoda özgü yeni bir tip parametresi eklemek mümkün değildi. Bu yüzden "bir listeyi başka tipte bir listeye dönüştüren" bir işlemi tip üzerinde metot olarak değil, paket düzeyinde ayrı bir generic fonksiyon olarak yazmak gerekiyordu. Go 1.27 ile metot bildirimi, alıcıdan sonra kendi tip parametre listesini taşıyabiliyor. Dil spesifikasyonu buna generic metot diyor ve tıpkı generic bir fonksiyon gibi, çağrılmadan ya da değer olarak kullanılmadan önce örneklenmesi (instantiate) gerektiğini belirtiyor.
package main
import (
"fmt"
"strconv"
)
type Liste[E any] []E
// Uygula, her öğeye f'yi uygulayıp yeni bir liste döndürür (generic metot).
func (l Liste[E]) Uygula[F any](f func(E) F) Liste[F] {
r := make(Liste[F], len(l))
for i, x := range l {
r[i] = f(x)
}
return r
}
func main() {
sayilar := Liste[int]{3, 14, 159}
metinler := sayilar.Uygula(strconv.Itoa)
fmt.Printf("%q\n", metinler)
uzunluk := metinler.Uygula(func(s string) int { return len(s) })
fmt.Println(uzunluk)
// Açık tip argümanı da verilebilir.
fmt.Println(sayilar.Uygula[float64](func(n int) float64 { return float64(n) / 2 }))
}
// Çıktı:
// ["3" "14" "159"]
// [1 2 3]
// [1.5 7 79.5]Örnekte Liste[E] tipinin Uygula[F any] metodu, alıcının E parametresine ek olarak kendi F parametresini tanımlıyor. İlk iki çağrıda F, verilen fonksiyonun dönüş tipinden çıkarılıyor; üçüncüsünde ise sayilar.Uygula[float64](...) ile açıkça veriliyor. Standart kütüphanede ilk örnek math/rand/v2 paketinde: Go Blog duyurusuna göre Rand tipinde daha önce her tamsayı tipi için ayrı metotlar (Int32N, Int64N, IntN gibi) vardı, şimdi tüm tamsayı tipleriyle çalışan tek bir generic N metodu eklendi.
Arayüz metotları generic olamaz
Sürüm notları önemli bir sınırı açıkça yazar: arayüz tiplerinin metotları tip parametresi tanımlayamaz ve arayüz metotları generic metotlarla uygulanamaz. Yani bir tipin generic Uygula metodu olması, onu Uygula isteyen bir arayüzü karşılar hâle getirmez. Arayüze tip parametreli metot yazmayı denerseniz Go 1.27.3 şu hatayı verir:
package main
type Donusturucu interface {
Donustur[T any](v T) string
}
func main() {}# command-line-arguments
./main.go:4:10: interface method must have no type parameters
./main.go:4:20: undefined: TArayüzlerin nasıl çalıştığı ve tiplerin onları örtük olarak nasıl karşıladığı interface rehberinde, alıcı tipleri ve metot kümeleri metotlar ve alıcı tipleri yazısında anlatılıyor.
Eski go.mod ile derleme hatası
Aynı Liste.Uygula kodunu go.mod dosyası go 1.26.0 diyen bir modülde derlediğimizde Go 1.27.3 araç zinciri şu mesajı verdi:
# ornek/m126
./main.go:11:26: generic method requires go1.27 or later (-lang was set to go1.26; check go.mod)Çözüm modülün dil sürümünü yükseltmektir; go mod edit -go=1.27 yalnızca go satırını değiştirir. Bağımlılıklarınız ve kütüphane kullanıcılarınız açısından bunun ne anlama geldiğini go mod rehberinde bulabilirsiniz.
Struct literalinde alan seçici anahtarlar
Önceden struct literalinde anahtar olarak yalnızca struct'ın kendi (üst düzey) alan adlarını yazabiliyordunuz. Gömülü bir struct'ın alanını doldurmak için önce gömülü tipi ayrı bir literal olarak yazmak gerekirdi: Musteri{Ad: "Deniz", Adres: Adres{Sehir: "İzmir"}}. Go 1.27 ile anahtar, struct tipi için geçerli herhangi bir alan seçici olabilir; yani m.Sehir diye erişebildiğiniz yükseltilmiş (promoted) bir alanı literalde doğrudan Sehir: olarak yazabilirsiniz.
package main
import "fmt"
type Adres struct {
Sehir string
Ilce string
}
type Musteri struct {
Ad string
Adres
}
func main() {
// Go 1.27: gömülü yapının alanı doğrudan anahtar olabilir.
m := Musteri{
Ad: "Deniz",
Sehir: "İzmir",
Ilce: "Bornova",
}
fmt.Printf("%+v\n", m)
}
// Çıktı:
// {Ad:Deniz Adres:{Sehir:İzmir Ilce:Bornova}}Dil spesifikasyonu bu kurala iki sınır koyar. Birincisi, seçili alana ulaşmak için geçilen gömülü alanların tipi işaretçi olamaz; gömülü alan *Adres olsaydı bu yazım geçersiz olurdu. İkincisi, anahtarlar çakışan alanları göstermemelidir: aynı literalde hem Adres: ... hem de Sehir: ... yazamazsınız, çünkü Sehir zaten Adres'in içindedir. Struct literalleri ve gömme konusunun tamamı için struct yapıları yazısına bakın.
Genelleştirilmiş fonksiyon tip çıkarımı
Üçüncü dil değişikliği tip çıkarımıyla ilgili. Generic bir fonksiyonu, eşleşen bir fonksiyon tipine sahip değişkene atadığınızda ya da o tipe dönüştürdüğünüzde derleyici tip argümanlarını artık her bağlamda çıkarabiliyor. Go Blog duyurusu üç örnek verir: bileşik literaller (composite literal), tip dönüşümleri ve kanal gönderimleri. Aşağıdaki programda Bicimle fonksiyonunun T parametresi üç farklı yerde de int olarak çıkarılıyor.
package main
import "fmt"
func Bicimle[T any](v T) string {
return fmt.Sprintf("değer: %v", v)
}
type IntBicimci func(int) string
func main() {
liste := []IntBicimci{Bicimle}
fn := IntBicimci(Bicimle)
ch := make(chan IntBicimci, 1)
ch <- Bicimle
fmt.Println(liste[0](7), fn(8), (<-ch)(9))
}
// Çıktı:
// değer: 7 değer: 8 değer: 9Spesifikasyonun atanabilirlik (assignability) bölümüne de bu kural eklendi: kısmen örneklenmiş olabilecek generic bir fonksiyon, eksik tip argümanları çıkarılabildiği ve tam örneklemeden sonra altta yatan tipler aynı olduğu sürece bir fonksiyon tipine atanabilir. Tip parametrelerinin temelleri için generics rehberine, kısıtlar için kısıtlar yazısına bakabilirsiniz.
Standart kütüphane: yeni paketler

encoding/json/v2 ve encoding/json/jsontext
encoding/json/v2, encoding/json'un büyük bir revizyonu. Marshal, MarshalWrite, MarshalEncode, Unmarshal, UnmarshalRead ve UnmarshalDecode fonksiyonları değişken sayıda Options argümanı alır. jsontext ise JSON'u token ve değer dizisi olarak işleyen alt düzey paket. Sürüm notlarına göre v2 daha katı varsayılanlar seçer: JSON string'lerindeki geçersiz UTF-8'i ve bir nesnedeki yinelenen adları reddeder. Eski encoding/json paketi artık v2 uygulamasının üzerinde çalışıyor; davranışı korunuyor ama hata mesajlarının metni değişebilir. Sorun yaşayanlar derleme sırasında GOEXPERIMENT=nojsonv2 ile eski uygulamaya dönebilir; notlara göre bu seçenek ileride kaldırılacak. Farkların tamamı ve geçiş yöntemleri encoding/json/v2 geçiş rehberinde, v1 kullanımı ise encoding/json yazısında.
uuid paketi
Yeni uuid paketi RFC 9562'deki UUID'leri üretir ve ayrıştırır. uuid.UUID 16 baytlık bir dizi tipidir ve == ile karşılaştırılabilir. New çoğu amaç için uygun algoritmayı kullanır (belgeye göre şu an NewV4 ile aynıdır), NewV7 ise en anlamlı 48 bitinde zaman damgası taşır ve sistem saati geri gitmedikçe artan sırada UUID üretir. Rastgele kısımlar kriptografik olarak güvenli bir üreticiden gelir. Aşağıdaki örnek çıktısı sabit olsun diye üretim yerine ayrıştırma kullanıyor; New ve NewV7 her çalıştırmada farklı değer döndürür.
package main
import (
"fmt"
"math/rand/v2"
"net/url"
"strings"
"uuid"
)
func main() {
u, err := uuid.Parse("F81D4FAE-7DEC-11D0-A765-00A0C91E6BF6")
fmt.Println(u, err)
fmt.Println(uuid.Nil(), uuid.Nil() == uuid.UUID{})
fmt.Println(u.Compare(uuid.Max()))
_, err = uuid.Parse("bozuk-uuid")
fmt.Println(err != nil)
dizin, dosya, ok := strings.CutLast("/var/log/app/hata.log", "/")
fmt.Println(dizin, dosya, ok)
r := rand.New(rand.NewPCG(1, 2))
var n uint8 = r.N(uint8(10))
fmt.Println(n < 10)
asil, _ := url.Parse("https://example.com/ara?q=go")
kopya := asil.Clone()
kopya.Path = "/yeni"
fmt.Println(asil, kopya)
}
// Çıktı:
// f81d4fae-7dec-11d0-a765-00a0c91e6bf6 <nil>
// 00000000-0000-0000-0000-000000000000 true
// -1
// true
// /var/log/app hata.log true
// true
// https://example.com/ara?q=go https://example.com/yeni?q=goParse büyük ve küçük harfi kabul eder, süslü parantezli, urn:uuid: önekli ve tiresiz biçimleri de okur; String ise her zaman küçük harfli, tireli biçimi üretir. uuid.Nil() tümü sıfır olan UUID'dir ve belge bunun Go'daki nil değeriyle aynı şey olmadığını özellikle not eder. Aynı örnekte iki küçük kütüphane eklemesi de var: strings.CutLast (ve bytes.CutLast) bir metni ayıracın son geçtiği yerden ikiye böler ve bazı LastIndex kullanımlarının yerini alır; url.URL.Clone bir URL'nin derin kopyasını oluşturur, böylece kopyada Path değiştirmek aslını etkilemez. Rand.N çağrısı ise yeni generic metodu gösteriyor.
crypto/mldsa ve simd
crypto/mldsa, FIPS 204'te tanımlanan kuantum sonrası ML-DSA imza şemasını uygular; crypto/x509 ML-DSA anahtarlarını ve imzalarını, crypto/tls de TLS 1.3'te ML-DSA imzalarını destekler hâle geldi. Deneysel simd paketi, donanımda varsa vektör komutlarını kullanan taşınabilir ve vektör boyutundan bağımsız bir SIMD arayüzü sunar; Go 1.26'da başlayan mimariye özgü simd/archsimd ise arm64 Neon ve WebAssembly 128 bit desteği kazandı. İkisi de yalnızca derleme sırasında GOEXPERIMENT=simd verildiğinde etkinleşir ve API henüz kararlı sayılmıyor.
Kütüphanedeki küçük değişikliklerden seçmeler
net/http: HTTP/1Response.Bodykapatıldığında okunmamış içerik, temkinli bir sınıra kadar otomatik olarak boşaltılıyor; bu bağlantıların yeniden kullanılmasını kolaylaştırıyor. YeniServer.MaxHeaderValueCountalanı kabul edilen başlık değeri sayısını sınırlıyor; HTTP/2 sunucusu RFC 9218 öncelik sinyallerini dikkate alıyor. İstemci tarafı için HTTP istemci yazısına bakın.net/http/httptest:NewTestServer,testing/synctestile kullanılmaya uygun, bellek içi sahte ağ kullanan bir test sunucusu oluşturuyor.testing/synctestpaketinetime.Sleepilesynctest.Wait'i birleştirenSleepeklendi.math/big:Int.Divide, bölüm ve kalanıTrunc,Floor,RoundveCeilyuvarlama kiplerinden biriyle hesaplıyor.net/url:URL.CloneveValues.Clonederin kopya oluşturuyor.hash/maphash:Hasherarayüzü, değerler ile gelecekteki hash tabanlı veri yapıları arasındaki sözleşmeyi tanımlıyor;ComparableHasherkarşılaştırılabilir tipler için hazır bir uygulama.unicode: paket ve sistem genelindeki destek Unicode 15'ten Unicode 17'ye yükseltildi.crypto/tls:MLKEM1024anahtar değişimi destekleniyor,Config.Randkullanımdan kaldırıldı (deprecated); deterministik testler içintesting/cryptotest.SetGlobalRandomöneriliyor.
Araçlardaki değişiklikler
go docartıkexample.com/pkg@v1.2.3gibipaket@sürümsorgularını ve bir paketin çalıştırılabilir örneklerini listeleyen-exseçeneğini destekliyor. Bir örnek adı verildiğinde (go doc bytes.ExampleBuffer) örneğin kaynak kodu yorumlarıyla yazdırılıyor.go mod tidy,go 1.27veya üstünü belirten modüllerde dağınıkrequirebloklarını birleştiriyor ve dosyayı en fazla iki bloğa (doğrudan ve dolaylı bağımlılıklar) indiriyor.go testartık varsayılan olarakstdversionvet denetimini çalıştırıyor: dosyada geçerli olan Go sürümüne göre fazla yeni kalan standart kütüphane sembollerini bildiriyor.go vetiçindeki printf denetimi,%wile sarılan değerin*Etipinde olduğu veE'nin kendisinin zatenerroruyguladığı çağrıları bildiriyor; notlara göre bu genellikleerrors.Isve tip denetimlerini bozan gizli bir hatadır. Hata sarmalama için hata yönetimi yazısına bakın.go fixyeni modernizer'lar kazandı (atomictypes,embedlit,slicesbackward,unsafefuncs);fmtappendfanalizcisi kaldırıldı,waitgroupanalizcisinin adıwaitgroupgooldu.gofmtsütun hizalama kararını veren mantıkta bir düzeltme içeriyor; önceden biçimlendirilmiş bazı dosyalarda küçük boşluk farkları çıkabilir.gokomutubzrsürüm denetim sistemi desteğini kaldırdı.go tool trace -http=:6060gibi yalnızca port verilen kullanımda artık yalnızca localhost dinleniyor.- Desteği kaldırılmış bir
GODEBUGayarıgo.modya da//go:debugiçinde son varsayılan değeriyle yazılmışsagokomutu bunu kabul ediyor; eski bir değerle yazılmışsa derleme başarısız oluyor.
Araçların günlük kullanımı için gofmt, go vet ve go doc yazısına bakabilirsiniz.
Çalışma zamanı ve derleyici
Derleyici artık küçük (80 bayttan küçük) bellek ayırmaları için boyuta özel ayırma rutinlerini çağırıyor. Sürüm notlarına göre bu bazı küçük ayırmaların maliyetini yüzde 30'a kadar düşürüyor, ayırma yoğun gerçek programlarda genel kazancın yaklaşık yüzde 1 olması bekleniyor ve ikili dosya boyutu yaklaşık 60 KB artıyor; GOEXPERIMENT=nosizespecializedmalloc ile kapatılabiliyor. Go 1.26'da deneysel olan goroutineleak profili artık genel kullanımda: runtime/pprof içinde ve net/http/pprof üzerinden /debug/pprof/goroutineleak uç noktasında, hiçbir zaman uyanamayacak biçimde bloke olmuş goroutine'leri raporluyor.
asynctimerchan GODEBUG ayarı kalıcı olarak kaldırıldı; time paketinin oluşturduğu kanallar artık her zaman tamponsuz (eşzamanlı). Go 1.27 veya üstünü hedefleyen modüllerde goroutine izleri (traceback) runtime/pprof etiketlerini başlık satırında gösteriyor. Derleyici closure'lar için daha basit adlar üretiyor; notlar, fonksiyon kodu işaretçilerini eşitlik için karşılaştıran (zaten yanlış olan) programlarda sorunun daha görünür olabileceğini belirtiyor. Zamanlayıcılar için select ve zaman aşımı yazısına bakabilirsiniz.
Platform değişiklikleri
Go 1.26 notlarında duyurulduğu gibi Go 1.27 macOS 13 Ventura veya üstünü gerektiriyor. Linux üzerindeki büyük endian 64 bit PowerPC portu (GOOS=linux GOARCH=ppc64) artık ELFv2 sistem ABI'sini kullanan ikili dosyalar üretiyor; bu Linux çekirdeği 3.13 veya üstünü gerektiriyor. Çapraz derleme ayarları için go build ve çapraz derleme yazısına bakın.
Sık yapılan hatalar

go.mod'u güncellemeden yeni söz dizimi kullanmak
Araç zincirini 1.27'ye yükseltmek tek başına yetmez; dil özellikleri modülün go satırına bağlıdır. Yukarıda gördüğünüz generic method requires go1.27 or later hatası bunun tipik belirtisidir.
Generic metotla arayüz karşılamayı beklemek
Generic bir metot, aynı adlı sıradan bir arayüz metodunu uygulamış sayılmaz ve arayüzlere tip parametreli metot yazılamaz. Ortak bir davranış tanımlamanız gerekiyorsa arayüzü generic olmayan metotlarla kurun, dönüştürme gibi işlemleri ise generic metot ya da fonksiyon olarak ekleyin.
İşaretçi gömmede alan seçici anahtar kullanmak
Gömülü alan bir işaretçi ise (*Adres) yeni literal kuralı uygulanmaz. Bu durumda gömülü değeri eskisi gibi açıkça oluşturmanız gerekir: Musteri{Adres: &Adres{Sehir: "İzmir"}}.
JSON çıktısının bayt bayt aynı kalacağını varsaymak
encoding/json artık v2 uygulamasıyla çalışıyor. Davranış korunuyor, ama hata mesajlarının metni değişebilir. Testleriniz hata metnini birebir karşılaştırıyorsa bunları errors.Is/errors.As ya da daha gevşek denetimlerle yazmak yükseltmeyi kolaylaştırır.
Sık Sorulan Sorular
Go 1.27'ye geçince kodum bozulur mu?
Sürüm notları Go 1 uyumluluk sözünün korunduğunu ve neredeyse tüm programların önceki gibi derlenip çalışmasının beklendiğini söyler. Yine de kaldırılan GODEBUG ayarlarına (asynctimerchan, gotypesalias ve bazı TLS ayarları) bağımlıysanız davranış değişir; bunları notlarda tek tek kontrol edin.
Generic metotlar hangi durumda işe yarar?
Bir tipe ait ama ek bir tip parametresi gerektiren işlemler için: dönüştürme (Liste[E]'den Liste[F]'ye), farklı tamsayı tipleriyle çalışma (Rand.N) gibi. Notlara göre amaç, daha önce paket kapsamında tanımlanması gereken generic fonksiyonları ilgili tipin ad alanına taşıyabilmek.
json/v2'ye geçmek zorunda mıyım?
Hayır. Sürüm notları v1 API'sinin desteklenmeye devam edeceğini ve kullanıcıların geçişe zorlanmadığını açıkça yazar. Yeni kodda v2'nin katı varsayılanları avantaj sağlar; mevcut kodda geçiş dikkatli test gerektirir.
Go 1.27'yi nasıl kurarım?
Resmî ikili arşivler Go projesinin indirme sayfasında yayımlanır. Kurulum adımları ve ilk program için Go kurulumu yazısına, birden fazla sürümü yönetmek için Go öğrenme rehberindeki araç bölümüne bakabilirsiniz.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Go öğrenme rehberi · Go 1.26 yenilikleri · encoding/json/v2 geçişi · Go generics · struct yapıları · Go nedir?