Pelajaran modul (1/5)
Antarmuka: mendefinisikan suatu perilaku
antarmuka di Go adalah sekumpulan tanda tangan metode. Sebuah nilai
mengimplementasikan antarmuka jika memiliki semua metode tersebut — tidak
implements, tidak ada extends, tidak ada registrasi eksplisit. Itu adalah
model yang sering disebut "pengetikan struktural" atau "pengetikan bebek statis":
kompiler memeriksa kesesuaian pada waktu kompilasi, tetapi berdasarkan
bentuk, bukan pada deklarasi.
Mendeklarasikan antarmuka
type Greeter interface {
Greet() string
}Konvensi: nama yang diakhiri dengan -er untuk antarmuka metode tunggal
(Reader, Writer, Stringer, Closer). Antarmuka kecil
(1–2 metode) bersifat idiomatis: perpustakaan standar penuh
antarmuka kecil yang bersatu (io.ReadWriter,
io.ReadCloser, …).
Implementasi implisit
type Person struct{ Name string }
func (p Person) Greet() string {
return "ciao " + p.Name
}
// Person satisfies Greeter because it has the required method.
var s Greeter = Person{Name: "Ada"}
fmt.Println(s.Greet())Tidak ada kata kunci. Jika tipenya memiliki metode, maka tipe tersebut dapat ditugaskan ke dalamnya variabel dari tipe antarmuka itu. Itu saja.
Polimorfisme melalui antarmuka
type Robot struct{ ID string }
func (r Robot) Greet() string { return "bip " + r.ID }
func greet(s Greeter) {
fmt.Println(s.Greet())
}
greet(Person{Name: "Ada"})
greet(Robot{ID: "R2"})greet menerima jenis apa pun yang memenuhi Greeter. Ini adalah cara Go
melakukan polimorfisme: tidak ada hierarki, hanya kemampuan.
Antarmuka kosong
var x interface{} = 42
var y any = "ciao" // any is the built-in alias of interface{}interface{} (atau any sejak Go 1.18) tidak memerlukan metode, jadi metode apa pun
nilai memuaskannya. Berguna untuk wadah umum, tetapi untuk mengekstrak
nilai konkret yang Anda perlukan ketik pernyataan atau ketik saklar
(pelajaran selanjutnya).
Kumpulan metode: nilai vs penerima penunjuk (pratinjau)
Ingat dari Modul 5:
- Metode dengan penerima nilai ada dalam kumpulan metode
Tdan*T. - Metode dengan penerima penunjuk HANYA ada dalam kumpulan metode
*T.
Konsekuensi praktis:
type Counter struct{ N int }
func (c *Counter) Inc() { c.N++ }
type Incrementer interface { Inc() }
var i Incrementer = &Counter{} // OK: *Counter has Inc()
// var j Incrementer = Counter{} // ERROR: Counter (value) does NOTKetika suatu metode memiliki penerima penunjuk, Anda harus menetapkan penunjuk ke sana variabel antarmuka.
Cobalah
Definisikan antarmuka Greeter dengan satu metode string Greet().
Tunjukkan petunjuk
Sintaks: `ketik Nama antarmuka { Metode(args) kembali }`.
Solusi tersedia setelah 3 upaya
Menerapkan Greeter pada Robot tipe baru dengan string ID bidang; metode mengembalikan 'bip' + ID.
Tunjukkan petunjuk
Tidak ada `implements`: cukup tentukan metode dengan tanda tangan yang tepat.
Solusi tersedia setelah 3 upaya
Bagaimana Anda menyatakan bahwa tipe P mengimplementasikan antarmuka Greeter?
type P struct{}
// ?Rekap
- Antarmuka = kumpulan tanda tangan metode; tidak ada
implements. - Implementasi implisit: cukup miliki metode dengan tanda tangan yang benar.
- Idiomatik: antarmuka kecil (1–2 metode), nama dalam
-er. interface{}/any: menerima nilai apa pun, kehilangan keamanan tipe.- Kumpulan metode: penerima penunjuk → hanya
*Tyang memenuhi antarmuka. - Go polimorfisme: parameter tipe antarmuka, tanpa hierarki.