Özet - Generic Koleksiyon
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 72 / 107.
Görev
KolayGo'da generic'ler hakkında öğrendiğiniz her şeyi sergileyen generic bir Queue (Kuyruk) veri yapısı inşa edelim! Bir yığının (stack - LIFO) aksine, kuyruk İlk-Giren-İlk-Çıkar (FIFO) düzenini takip eder; yani eklenen ilk öğe, çıkarılan ilk öğedir.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
queue.go: Generic kuyruk koleksiyonunuzu tanımlayın.Öğeleri dahili olarak saklayan generic bir
Queue[T any]struct'ı oluşturun. Kuyruğunuz şu işlemleri desteklemelidir:Enqueue(item T)- kuyruğun arkasına bir öğe eklerDequeue() (T, bool)- kuyruğun önündeki öğeyi kaldırır ve döndürür, ayrıca işlemin başarılı olup olmadığını belirten bir boolean döndürür (kuyruk boşsa sıfır değerini vefalsedöndürün)Peek() (T, bool)- önündeki öğeyi kaldırmadan döndürür (Dequeue ile aynı dönüş modelini kullanır)Size() int- kuyruktaki öğe sayısını döndürürIsEmpty() bool- kuyrukta öğe yoksa true döndürür
Ayrıca, başlatılmış boş bir kuyruğa işaretçi döndüren bir
NewQueue[T any]() *Queue[T]yapıcı (constructor) fonksiyonu oluşturun.main.go: Girişe bağlı olarak kuyruğunuzu farklı tiplerle gösterin.Bir tip göstergesi (
intveyastring) okuyun, ardından kuyruk üzerinde gerçekleştirilecek bir dizi komutu okuyun. Her komut kendi satırındadır:enqueue [value]- değeri kuyruğa eklerdequeue- önündeki öğeyi kaldırır ve yazdırır (kuyruk boşsaemptyyazdırın)peek- önündeki öğeyi kaldırmadan yazdırır (kuyruk boşsaemptyyazdırın)size- mevcut boyutu yazdırır
donekomutunu alana kadar komutları okumaya devam edin.
Aşağıdaki girişler sağlanacaktır:
- Satır 1: Tip göstergesi (
intveyastring) - Sonraki satırlar:
donegelene kadar komutlar
Örneğin, şu giriş verildiğinde:
int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
doneÇıktınız şu olmalıdır:
10
10
2
20
30
emptyVe şu giriş verildiğinde:
string
enqueue hello
enqueue world
size
peek
dequeue
peek
doneÇıktınız şu olmalıdır:
2
hello
hello
worldKuyruğunuz hem tam sayı hem de dize tipleri için aynı şekilde çalışmalı ve tek bir generic uygulamanın tam tip güvenliğini korurken birden fazla somut tipi nasıl işlediğini göstermelidir.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Tip göstergesini oku
scanner.Scan()
typeIndicator := scanner.Text()
if typeIndicator == "int" {
// TODO: NewQueue[int]() kullanarak bir integer kuyruğu oluşturun
// Integer kuyruğu için komutları işle
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Komutları yönetin: enqueue, dequeue, peek, size
// enqueue için, parts[1] içindeki integer değerini ayrıştırın
// dequeue/peek için, kuyruk boşsa "empty" yazdırın
_ = command
}
} else if typeIndicator == "string" {
// TODO: NewQueue[string]() kullanarak bir string kuyruğu oluşturun
// String kuyruğu için komutları işle
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Komutları yönetin: enqueue, dequeue, peek, size
// enqueue için, parts[1] içindeki string değerini kullanın
// dequeue/peek için, kuyruk boşsa "empty" yazdırın
_ = command
}
}
// Bunlar, geliştirme sırasında kullanılmayan import hatalarını önlemek için buradadır
_ = strconv.Atoi
_ = fmt.Println
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool