Lompati ke konten utama
Modul 6 · Pelajaran 1 dari 526/50 dalam kursus~12 min
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

Go
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

Go
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

Go
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

Go
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 T dan *T.
  • Metode dengan penerima penunjuk HANYA ada dalam kumpulan metode *T.

Konsekuensi praktis:

Go
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 NOT

Ketika suatu metode memiliki penerima penunjuk, Anda harus menetapkan penunjuk ke sana variabel antarmuka.

Cobalah

Latihan#go.m6.l1.e1
Upaya: 0Memuat…

Definisikan antarmuka Greeter dengan satu metode string Greet().

Memuat editor…
Tunjukkan petunjuk

Sintaks: `ketik Nama antarmuka { Metode(args) kembali }`.

Solusi tersedia setelah 3 upaya

Latihan#go.m6.l1.e2
Upaya: 0Memuat…

Menerapkan Greeter pada Robot tipe baru dengan string ID bidang; metode mengembalikan 'bip' + ID.

Memuat editor…
Tunjukkan petunjuk

Tidak ada `implements`: cukup tentukan metode dengan tanda tangan yang tepat.

Solusi tersedia setelah 3 upaya

Quiz#go.m6.l1.e3
Siap

Bagaimana Anda menyatakan bahwa tipe P mengimplementasikan antarmuka Greeter?

Go
type P struct{}
// ?
Pilihan jawaban

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 *T yang memenuhi antarmuka.
  • Go polimorfisme: parameter tipe antarmuka, tanpa hierarki.