Pengenalan Interface
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 25 dari 107.
Interface di Go mendefinisikan sekumpulan tanda tangan method tanpa mengimplementasikannya. Interface menjelaskan apa yang dapat dilakukan oleh suatu tipe, bukan bagaimana cara melakukannya. Tipe apa pun yang mengimplementasikan semua method dalam sebuah interface otomatis memenuhi interface tersebut.
Berikut cara mendefinisikan interface:
type Speaker interface {
Speak() string
}Interface Speaker ini mengharuskan setiap tipe yang mengimplementasikannya memiliki method Speak() yang mengembalikan string. Sekarang, struct apa pun dengan method ini dapat digunakan di mana pun Speaker diharapkan.
type Dog struct {
Name string
}
func (d Dog) Speak() string {
return d.Name + " says woof!"
}
type Cat struct {
Name string
}
func (c Cat) Speak() string {
return c.Name + " says meow!"
}Dog dan Cat sama-sama memenuhi interface Speaker karena keduanya memiliki method Speak() dengan signature yang benar. Sekarang kamu bisa menulis fungsi yang menerima Speaker apa pun:
func MakeSound(s Speaker) {
fmt.Println(s.Speak())
}
func main() {
dog := Dog{Name: "Buddy"}
cat := Cat{Name: "Whiskers"}
MakeSound(dog) // Buddy berkata guk!
MakeSound(cat) // Whiskers berkata meong!
}Antarmuka memungkinkan kamu menulis kode yang fleksibel dan dapat digunakan kembali, yang berfungsi dengan tipe apa pun yang memenuhi persyaratan antarmuka, apa pun implementasi yang mendasarinya.
Tantangan
MudahMari buat sistem deskripsi kendaraan yang menunjukkan cara interface memungkinkan berbagai tipe berbagi perilaku umum. Kamu akan membuat interface yang dapat dipenuhi oleh beberapa tipe kendaraan, lalu menggunakannya untuk mendeskripsikan kendaraan apa pun dengan cara yang seragam.
Kamu akan mengatur kodemu dalam dua file:
vehicles.go: Definisikan interfaceDescriberdengan satu methodDescribe() string. Lalu buat dua struct yang memenuhi interface ini:Cardengan fieldBranddanModel(keduanya bertipe string)Bicycledengan fieldType(string) danGears(int)
Describe()yang mengembalikan string deskriptif tentang kendaraan tersebut.main.go: Buat fungsi bernamaPrintDescriptionyang menerimaDescriberapa pun dan mencetak hasil pemanggilan methodDescribe()-nya. Baca informasi kendaraan dari input, buat satu Car dan satu Bicycle, lalu gunakan fungsimu untuk mencetak deskripsi masing-masing.
Input berikut akan diberikan:
- Baris 1: Merek Car
- Baris 2: Model Car
- Baris 3: Tipe Bicycle
- Baris 4: Jumlah gigi (integer)
Method Describe()-mu harus mengembalikan string dengan format berikut:
- Car:
[Brand] [Model] - Bicycle:
[Type] bike with [Gears] gears
Contohnya, jika diberikan Toyota, Camry, Mountain, dan 21, output-mu seharusnya:
Toyota Camry
Mountain bike with 21 gearsInti pentingnya adalah fungsi PrintDescription-mu dapat bekerja dengan tipe apa pun yang memiliki method Describe(). Fungsi ini tidak perlu mengetahui apakah yang ditanganinya adalah Car, Bicycle, atau tipe kendaraan lain yang mungkin kamu tambahkan nanti.
Coba sendiri
package main
import (
"fmt"
)
// TODO: Buat fungsi PrintDescription yang menerima Describer apa pun
// dan mencetak hasil pemanggilan method Describe() miliknya
func main() {
// Baca input
var carBrand string
var carModel string
var bicycleType string
var gears int
fmt.Scanln(&carBrand)
fmt.Scanln(&carModel)
fmt.Scanln(&bicycleType)
fmt.Scanln(&gears)
// TODO: Buat Car dengan merek dan model dari input
// TODO: Buat Bicycle dengan jenis dan jumlah gigi dari input
// TODO: Gunakan PrintDescription untuk mencetak deskripsi mobil
// TODO: Gunakan PrintDescription untuk mencetak deskripsi sepeda
}
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 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