sort.Interface Arayüzü
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 74 / 107.
sort paketi, arayüz tabanlı tasarımın bir başka mükemmel örneğini sunar. Özel bir koleksiyonu sıralamak için türünüzün sort.Interface arayüzünü uygulaması gerekir:
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}Bu üç yöntem, sıralama algoritmasına ihtiyaç duyduğu her şeyi sağlar: koleksiyonun uzunluğu, öğeleri karşılaştırmanın bir yolu ve öğelerin yerlerini değiştirme yöntemi. Özel struct'lardan oluşan bir dilimi sıralanabilir hâle getirme yöntemi şöyledir:
type Person struct {
Name string
Age int
}
type ByAge []Person
func (a ByAge) Len() int { return len(a) }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func main() {
people := []Person{
{"Alice", 30},
{"Bob", 25},
{"Carol", 35},
}
sort.Sort(ByAge(people))
fmt.Println(people)
// [{Bob 25} {Alice 30} {Carol 35}]
}Temel fikir, diliminize dayalı adlandırılmış bir tür (ByAge) oluşturmaktır. Bu, aynı veriler için farklı sıralama davranışları tanımlamanı sağlar. Bunun yerine alfabetik olarak sıralamak için farklı bir Less uygulamasıyla ByName oluşturabilirsin.
Türünüz sort.Interface arayüzünü sağladığında, sort.Sort(), sort.Reverse() ve sort.IsSorted() ile otomatik olarak çalışır.
Görev
KolayGo'nun sort.Interface gücünü gösteren sıralanabilir bir ürün envanteri sistemi oluşturalım! Bir Product türü oluşturacak ve aynı koleksiyonun farklı şekillerde sıralanabilmesini sağlayan birden çok sıralama stratejisi uygulayacaksın.
Kodunu iki dosya arasında düzenleyeceksin:
product.go: Ürün türünü ve sıralama uygulamalarını tanımla.Üç alanı olan bir
Productstruct'ı oluştur:Name(string),Price(float64) veQuantity(int).[]Producttemel alınarak iki adlandırılmış tür oluştur:ByPrice- ürünleri artan fiyata göre sıralamak içinByQuantity- ürünleri azalan miktara göre sıralamak için (en yüksek miktar önce)
Her türün,
sort.Interfacetarafından gerekli olan üç yöntemi uygulaması gerekir:Len(),Less(i, j int)veSwap(i, j int).Lessyöntemi, her tür için sıralama düzenini belirler.main.go: Ürün envanterini oluştur ve sırala.Bir sıralama modu (
priceveyaquantity) oku, ardından ürün sayısını ve ürün ayrıntılarını oku. Her ürün üç satır olarak sağlanır: ad, fiyat ve miktar.Ürünlerden oluşan bir dilim oluştur, moda göre uygun sıralama türünü kullanarak sırala ve ardından her ürünü şu biçimde yazdır:
[Name]: $[Price] (x[Quantity])Fiyatları iki ondalık basamakla görüntüle.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Sıralama modu (
priceveyaquantity) - 2. satır: Ürün sayısı
- Sonraki satırlar: Ürün ayrıntıları (ad, fiyat, miktar - ürün başına üç satır)
Örneğin, aşağıdaki verildiğinde:
price
3
Laptop
999.99
5
Mouse
29.99
50
Keyboard
79.99
25Çıktın şöyle olmalıdır:
Mouse: $29.99 (x50)
Keyboard: $79.99 (x25)
Laptop: $999.99 (x5)Ve aşağıdaki verildiğinde:
quantity
3
Laptop
999.99
5
Mouse
29.99
50
Keyboard
79.99
25Çıktın şöyle olmalıdır:
Mouse: $29.99 (x50)
Keyboard: $79.99 (x25)
Laptop: $999.99 (x5)Aynı ürün verilerinin, yalnızca farklı bir adlandırılmış tür kullanılarak nasıl farklı biçimlerde sıralanabildiğine dikkat et. Türlerin sort.Interface koşullarını karşılamasının ardından standart kitaplıktaki sort.Sort() ile sorunsuz şekilde çalışırlar.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Sıralama modunu oku
var mode string
fmt.Fscanln(reader, &mode)
// Ürün sayısını oku
var count int
fmt.Fscanln(reader, &count)
// Ürünleri oku
products := make([]Product, count)
for i := 0; i < count; i++ {
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
priceStr, _ := reader.ReadString('\n')
priceStr = strings.TrimSpace(priceStr)
price, _ := strconv.ParseFloat(priceStr, 64)
qtyStr, _ := reader.ReadString('\n')
qtyStr = strings.TrimSpace(qtyStr)
quantity, _ := strconv.Atoi(qtyStr)
products[i] = Product{Name: name, Price: price, Quantity: quantity}
}
// TODO: Ürünleri moda göre sırala
// mode "price" ise ByPrice tipini kullan
// mode "quantity" ise ByQuantity tipini kullan
// Uygun tip ile sort.Sort() kullan
// TODO: Her ürünü şu formatta yazdır:
// [Name]: $[Price] (x[Quantity])
// Fiyat biçimlendirmesi için %.2f ile fmt.Printf kullan
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
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ı11Standart Kütüphane ve OOP
io.Reader ve io.Writersort.Interface Arayüzüfmt.Stringer ArayüzüStruct'lar ile encoding/jsonhttp.Handler ArayüzüÖzet - REST API Modelleri3İş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