Skip to content

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, nil değ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.After ile 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ı:

  1. Önce slice ve string öğrenin, temel veri yapılarını anlayın
  2. Ardından map öğrenin, hash tablosu implementasyonunu anlayın
  3. Sonra channel öğrenin, goroutine iletişim mekanizmasını anlayın
  4. Ardından select öğrenin, çoğullama tekniklerini öğrenin
  5. Son olarak syncmap öğrenin, eşzamanlılık güvenli implementasyonu anlayın

Golang by www.golangdev.cn edit