sort.Interface
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 74 dari 107.
Package sort memberikan contoh lain yang sangat baik tentang desain berbasis interface. Untuk mengurutkan koleksi kustom, tipe kamu harus mengimplementasikan sort.Interface:
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}Ketiga method ini memberikan semua yang dibutuhkan algoritma pengurutan: panjang koleksi, cara membandingkan elemen, dan cara menukarnya. Berikut cara membuat slice berisi struct kustom agar bisa diurutkan:
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}]
}Gagasan utamanya adalah membuat tipe bernama (ByAge) berdasarkan slice-mu. Dengan begitu, kamu bisa menentukan perilaku pengurutan yang berbeda untuk data yang sama. Kamu bisa membuat ByName dengan implementasi Less yang berbeda untuk mengurutkan secara alfabetis.
Setelah tipe milikmu memenuhi sort.Interface, tipe tersebut otomatis dapat digunakan dengan sort.Sort(), sort.Reverse(), dan sort.IsSorted().
Tantangan
MudahMari buat sistem inventaris produk yang dapat diurutkan untuk menunjukkan kehebatan sort.Interface milik Go! Kamu akan membuat tipe Product dan mengimplementasikan beberapa strategi pengurutan, sehingga koleksi yang sama dapat diurutkan dengan cara yang berbeda.
Kamu akan mengatur kodemu dalam dua file:
product.go: Definisikan tipe produk dan implementasi pengurutan.Buat struct
Productdengan tiga field:Name(string),Price(float64), danQuantity(int).Buat dua tipe bernama berdasarkan
[]Product:ByPrice- untuk mengurutkan produk berdasarkan harga dari yang terendah ke tertinggiByQuantity- untuk mengurutkan produk berdasarkan jumlah dari yang tertinggi ke terendah (jumlah terbanyak lebih dulu)
Setiap tipe harus mengimplementasikan tiga method yang diwajibkan oleh
sort.Interface:Len(),Less(i, j int), danSwap(i, j int). MethodLessmenentukan urutan pengurutan untuk setiap tipe.main.go: Buat dan urutkan inventaris produkmu.Baca mode pengurutan (
priceatauquantity), lalu baca jumlah produk yang diikuti detail produk. Setiap produk diberikan dalam tiga baris: nama, harga, dan jumlah.Buat slice produk, urutkan menggunakan tipe pengurutan yang sesuai berdasarkan mode, lalu cetak setiap produk dengan format ini:
[Name]: $[Price] (x[Quantity])Tampilkan harga dengan dua angka di belakang koma.
Input berikut akan diberikan:
- Baris 1: Mode pengurutan (
priceatauquantity) - Baris 2: Jumlah produk
- Baris berikutnya: Detail produk (nama, harga, jumlah, tiga baris untuk setiap produk)
Contohnya, jika diberikan:
price
3
Laptop
999.99
5
Mouse
29.99
50
Keyboard
79.99
25Outputmu seharusnya:
Mouse: $29.99 (x50)
Keyboard: $79.99 (x25)
Laptop: $999.99 (x5)Jika diberikan:
quantity
3
Laptop
999.99
5
Mouse
29.99
50
Keyboard
79.99
25Outputmu seharusnya:
Mouse: $29.99 (x50)
Keyboard: $79.99 (x25)
Laptop: $999.99 (x5)Perhatikan bagaimana data produk yang sama dapat diurutkan dengan cara berbeda hanya dengan menggunakan tipe bernama yang berbeda. Setelah tipemu memenuhi sort.Interface, tipe tersebut dapat digunakan dengan mudah bersama sort.Sort() dari standard library.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca mode pengurutan
var mode string
fmt.Fscanln(reader, &mode)
// Baca jumlah produk
var count int
fmt.Fscanln(reader, &count)
// Baca data produk
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: Urutkan produk berdasarkan mode
// Jika mode adalah "price", gunakan tipe ByPrice
// Jika mode adalah "quantity", gunakan tipe ByQuantity
// Gunakan sort.Sort() dengan tipe yang sesuai
// TODO: Tampilkan setiap produk dalam format:
// [Name]: $[Price] (x[Quantity])
// Gunakan fmt.Printf dengan %.2f untuk memformat harga
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File11Pustaka Standar & OOP
io.Reader & io.Writersort.InterfaceAntarmuka fmt.Stringerencoding/json dengan StructAntarmuka http.HandlerRingkasan, Model REST API3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online