ProgramlamaGo Geliştirici

Go'da hangi veri türleri karşılaştırılabilir (comparable) olarak kabul edilir ve karşılaştırılamayan türleri karşılaştırmaya çalıştığınızda ne olur? Bu, map ve set kullanımını nasıl etkiler?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Tüm sayısal türler (int, float64, ...)
  • Karakterler (string, rune)
  • İşaretçiler
  • Kanallar
  • Arayüzler, eğer değerleri karşılaştırılabiliyorsa
  • Diziler (array) ve yapılar, eğer tüm alanları karşılaştırılabiliyorsa

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.

Çeldirici Soru

"İ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

Konunun karmaşıklığından kaynaklanan gerçek hata örnekleri


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.