Ringkasan Koleksi Generik
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 72 dari 107.
Tantangan
MudahMari buat struktur data Queue generik yang menunjukkan semua hal yang sudah kamu pelajari tentang generics di Go! Berbeda dengan stack (LIFO), queue mengikuti urutan First-In-First-Out (FIFO): item pertama yang ditambahkan adalah item pertama yang dihapus.
Kamu akan menyusun kodemu dalam dua file:
queue.go: Definisikan koleksi queue generikmu.Buat struct generik
Queue[T any]yang menyimpan item secara internal. Queue-mu harus mendukung operasi berikut:Enqueue(item T)- menambahkan item ke bagian belakang queueDequeue() (T, bool)- menghapus dan mengembalikan item dari bagian depan queue, beserta nilai boolean yang menunjukkan keberhasilan (kembalikan nilai nol danfalsejika queue kosong)Peek() (T, bool)- mengembalikan item di bagian depan tanpa menghapusnya (pola nilai kembalian sama seperti Dequeue)Size() int- mengembalikan jumlah item dalam queueIsEmpty() bool- mengembalikan true jika queue tidak memiliki item
Buat juga fungsi konstruktor
NewQueue[T any]() *Queue[T]yang mengembalikan pointer ke queue kosong yang sudah diinisialisasi.main.go: Tunjukkan queue-mu dengan berbagai tipe berdasarkan input.Baca indikator tipe (
intataustring), lalu baca serangkaian perintah untuk dijalankan pada queue. Setiap perintah berada pada baris tersendiri:enqueue [value]- tambahkan nilai ke queuedequeue- hapus dan cetak item di bagian depan (cetakemptyjika queue kosong)peek- cetak item di bagian depan tanpa menghapusnya (cetakemptyjika queue kosong)size- cetak ukuran saat ini
Baca perintah sampai kamu menerima
done.
Input berikut akan diberikan:
- Baris 1: Indikator tipe (
intataustring) - Baris berikutnya: Perintah sampai
done
Contohnya, jika diberikan:
int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
doneOutput-mu seharusnya:
10
10
2
20
30
emptyDan jika diberikan:
string
enqueue hello
enqueue world
size
peek
dequeue
peek
doneOutput-mu seharusnya:
2
hello
hello
worldQueue-mu harus bekerja dengan cara yang sama untuk tipe integer dan string, menunjukkan cara satu implementasi generik menangani beberapa tipe konkret sambil tetap menjaga keamanan tipe secara penuh.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Baca penanda tipe
scanner.Scan()
typeIndicator := scanner.Text()
if typeIndicator == "int" {
// TODO: Buat queue bilangan bulat menggunakan NewQueue[int]()
// Proses perintah untuk queue bilangan bulat
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Tangani perintah: enqueue, dequeue, peek, size
// Untuk enqueue, ubah nilai bilangan bulat dari parts[1]
// Untuk dequeue/peek, cetak "empty" jika queue kosong
_ = command
}
} else if typeIndicator == "string" {
// TODO: Buat queue string menggunakan NewQueue[string]()
// Proses perintah untuk queue string
for scanner.Scan() {
line := scanner.Text()
if line == "done" {
break
}
parts := strings.SplitN(line, " ", 2)
command := parts[0]
// TODO: Tangani perintah: enqueue, dequeue, peek, size
// Untuk enqueue, gunakan nilai string dari parts[1]
// Untuk dequeue/peek, cetak "empty" jika queue kosong
_ = command
}
}
// Ini ada untuk mencegah error akibat import yang tidak digunakan selama pengembangan
_ = strconv.Atoi
_ = fmt.Println
}
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 File3Pointer 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