Ö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 jenerikler hakkında öğrendiğiniz her şeyi gösteren genel bir Kuyruk veri yapısı oluşturalım! Bir yığının (LIFO) aksine kuyruk, İlk Giren İlk Çıkar (FIFO) sıralamasını izler: eklenen ilk öğe, çıkarılan ilk öğedir.
Kodunuzu iki dosya arasında düzenleyeceksiniz:
queue.go: Genel kuyruk koleksiyonunuzu tanımlayın.Öğeleri dahili olarak depolayan genel bir
Queue[T any]yapısı oluşturun. Kuyruğunuz şu işlemleri desteklemelidir:Enqueue(item T)- kuyruğun sonuna bir öğe eklerDequeue() (T, bool)- kuyruğun başındaki öğeyi kaldırır ve döndürür; bununla birlikte 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)- baştaki öğeyi kaldırmadan döndürür (Dequeue ile aynı dönüş düzeni)Size() int- kuyruktaki öğe sayısını döndürürIsEmpty() bool- kuyrukta hiç öğe yoksa true döndürür
Ayrıca başlatılmış boş bir kuyruğa işaretçi döndüren bir oluşturucu işlevi
NewQueue[T any]() *Queue[T]oluşturun.main.go: Kuyruğunuzu girdiye dayalı olarak farklı türlerle gösterin.Bir tür belirteci (
intveyastring) okuyun, ardından kuyruk üzerinde gerçekleştirilecek bir dizi komut okuyun. Her komut kendi satırındadır:enqueue [value]- değeri kuyruğa eklerdequeue- baştaki öğeyi kaldırır ve yazdırır (kuyruk boşsaemptyyazdırın)peek- baştaki öğeyi kaldırmadan yazdırır (kuyruk boşsaemptyyazdırın)size- mevcut boyutu yazdırır
donealana kadar komutları okumaya devam edin.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Tür belirteci (
intveyastring) - Sonraki satırlar:
donegelene kadar komutlar
Örneğin, şu verildiğinde:
int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
doneÇıktınız şu şekilde olmalıdır:
10
10
2
20
30
emptyVe şu verildiğinde:
string
enqueue hello
enqueue world
size
peek
dequeue
peek
doneÇıktınız şu şekilde olmalıdır:
2
hello
hello
worldKuyruğunuz hem tamsayı hem de string türleri için aynı şekilde çalışmalı; tek bir genel uygulamanın, tam tür güvenliğini korurken birden fazla somut türü 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 tamsayı kuyruğu oluştur
// Tamsayı 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ı işle: enqueue, dequeue, peek, size
// enqueue için, tamsayı değerini parts[1]'den ayrıştır
// dequeue/peek için, kuyruk boşsa "empty" yazdır
_ = command
}
} else if typeIndicator == "string" {
// TODO: NewQueue[string]() kullanarak bir string kuyruğu oluştur
// 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ı işle: enqueue, dequeue, peek, size
// enqueue için, parts[1]'deki string değerini kullan
// dequeue/peek için, kuyruk boşsa "empty" yazdır
_ = 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 PoolKendi başına pratik yap: Online Go derleyicisi