Veri Yapıları
Go'nun basit bir sözdizimi olmasına rağmen, birçok güçlü yerleşik çekirdek veri yapısına sahiptir. Bu veri yapıları Go programlarının temel yapı taşlarıdır. Uygulama prensiplerini anlamak daha verimli kod yazmaya yardımcı olur. Bu makale Go'da kullanılan birkaç yaygın veri yapısını ve alt düzey implementasyonlarını tanıtır.
Temel Veri Yapıları
slice
Slice Go'da en yaygın kullanılan veri yapısıdır, dizilerin soyutlaması ve sarmalayıcısıdır. Ana özellikler:
- Dinamik boyut: Slice uzunluğu dinamik olarak büyüyebilir
- Referans semantiği: Slice geçirildiğinde sadece struct kopyalanır, altta yatan dizi değil
- Genişletme mekanizması: Kapasite yetersiz olduğunda otomatik olarak genişler
Çalışma zamanında, slice slice struct'ı ile temsil edilir, üç alan içerir: altta yatan diziye pointer, uzunluk ve kapasite.
string
String Go'daki en temel veri tiplerinden biridir. Ana özellikler:
- Değiştirilemezlik: Bir kez oluşturulduktan sonra string değiştirilemez
- UTF-8 kodlama: Genellikle UTF-8 kodlu metni temsil eder
- Sıfır değer güvenliği: string'in sıfır değeri boş string
""'dir,nildeğil
Çalışma zamanında, string stringStruct struct'ı ile temsil edilir, bir byte dizisine pointer ve uzunluk içerir.
Konteyner Veri Yapıları
map
map Go'nun yerleşik anahtar-değer konteyneridir, hash tablosu kullanılarak implemente edilmiştir. Ana özellikler:
- Hash tablosu implementasyonu: Hash fonksiyonları kullanarak elemanları hızlıca bulur
- Otomatik genişleme: Yük faktörü çok yüksek olduğunda otomatik olarak genişler
- Eşzamanlılık güvenli değil: Eşzamanlı okuma/yazma ek senkronizasyon gerektirir
Çalışma zamanında, map hmap struct'ı ile temsil edilir, bucket dizisi, hash tohumu, eleman sayısı ve diğer alanları içerir.
syncmap
sync.Map standart kütüphane tarafından sağlanan eşzamanlılık güvenli bir map'tir, çoğunlukla okuma senaryoları için uygundur. Ana özellikler:
- Okuma-yazma ayrımı: Okuma ve kirli olmak üzere iki map kullanır, okuma-yazma ayrımı için
- Atomik işlemler: okuma map kilitleme olmadan atomik işlemler kullanır
- Aşamalı taşıma: Iska sayısı eşiğe ulaştığında kirliyi okumaya terfi ettirir
sync.Map zamandan kazanmak için alan feda eder, belirli senaryolarda map + mutex'ten daha iyi performans sağlar.
Eşzamanlılık Veri Yapıları
channel
channel Go'nun CSP felsefesinin tipik bir temsilcisidir, goroutine'ler arası iletişim için kullanılır. Ana özellikler:
- Goroutine iletişimi: channel aracılığıyla goroutine'ler arasında veri aktarır
- Senkronizasyon mekanizması: Tamponsuz channel goroutine senkronizasyonu için kullanılabilir
- Kilitli kuyruk: Altta yatan kilitli bir dairesel kuyruktur
Çalışma zamanında, channel hchan struct'ı ile temsil edilir, dairesel tampon, bekleme kuyruğu ve diğer alanları içerir.
select
select aynı anda birden fazla channel'ın durumunu izleyebilir, çoğullama sağlar. Ana özellikler:
- Blokalamaz: Birden fazla channel'ın müsait olup olmadığını bloklamadan kontrol edebilir
- Rastgele seçim: Birden fazla channel müsait olduğunda birini rastgele seçer
- Zaman aşımı kontrolü:
time.Afterile zaman aşımı mekanizması implemente edebilir
Çalışma zamanında, select her dalı temsil etmek için scase struct'ını kullanır, channel durumlarını yoklama yoluyla kontrol eder.
Öğrenme Önerileri
Önerilen öğrenme sırası:
- Önce slice ve string öğrenin, temel veri yapılarını anlayın
- Ardından map öğrenin, hash tablosu implementasyonunu anlayın
- Sonra channel öğrenin, goroutine iletişim mekanizmasını anlayın
- Ardından select öğrenin, çoğullama tekniklerini öğrenin
- Son olarak syncmap öğrenin, eşzamanlılık güvenli implementasyonu anlayın
