Go'da değişkenleri birbirleriyle == operatörüyle karşılaştırabilir veya bunları map anahtarı olarak kullanabilirsiniz sadece türleri karşılaştırılabilir ise. Karşılaştırılabilir olanlar:
int, float64, ...)string, rune)Dilimler, map'ler, fonksiyonlar — karşılaştırılamaz!
Böyle değerleri karşılaştırmaya çalışmak derleme hata ile sonuçlanır. Örneğin:
var a = []int{1,2,3} var b = []int{1,2,3} printf("%v", a==b) // derleme hatası: dilim yalnızca nil ile karşılaştırılabilir
Bir değeri map'te anahtar olarak kullanmak için, karşılaştırılabilir olması gereklidir. Eğer tür uyumsuzsa — derleme hatası olacaktır.
"İki yapı yalnızca bazı alanları karşılaştırılamazsa karşılaştırılabilir mi?"
Çoğu "evet" der, ancak bu yanlış. Eğer yapıların en az bir alanı karşılaştırılamıyorsa (örneğin, bu bir dilim veya map ise), tüm yapı karşılaştırılamaz hale gelir.
Örnek:
type T struct { A int S []string } var t1, t2 T t1 == t2 // derleme hatası: Dilimler karşılaştırılamaz
Hikaye
Bir geliştirici, sonuçları önbelleğe almak için map'e anahtar olarak dilim kullanmaya çalıştı, bu derleme hatasına neden oldu. Açık bir serileştirici ile string ile değiştirdiler — sorun çözüldü.
Hikaye
Bir yapıya yeni bir alan (dilim türü) eklendiğinde, anahtar olarak kullanılan yapı aniden derlenemez hale geldi. Sebep: yapı artık karşılaştırılamaz oldu, ama kimse bunun iç içe geçmiş yapılara da yayılacağını beklemiyordu.
Hikaye
İçinde dilimler bulunan yapılara göre bir küme (set) oluşturmak için map kullanmaya çalıştılar. Karşılaştırma kurallarını anlamadan, elemanları karşılaştırmaya çalışırken bir dizi çalışma zamanı hatası aldılar, ama sebep, böyle bir anahtar ile derlenememeleriydi.