Interface
Kontrak perilaku yang dipenuhi tipe apa pun yang punya methodnya.
Pahami konsepnya
Interface adalah daftar method yang menjadi kontrak perilaku. Berbeda dari banyak bahasa, Go tidak meminta pernyataan "mengimplementasikan" — tipe mana pun yang memiliki method yang dimaksud otomatis dianggap memenuhi interface, secara implisit dan tanpa upacara.
Fungsi yang menerima parameter bertipe interface bisa dipakai bersama semua tipe pemenuh kontrak itu. Ini membalik cara berpikir: kode tidak perlu tahu tipe concrete-nya, cukup apa yang bisa dilakukannya — dan tipe baru cukup menyediakan method yang tepat untuk langsung masuk.
Dari nilai interface, tipe aslinya bisa ditarik kembali lewat type assertion (v.(*Email)) dengan bentuk aman v, ok := x.(T), atau ditelusuri bertingkat lewat type switch. Interface juga bisa saling ditanam (embed) untuk menggabung kontrak — io.ReadWriter gabungan Reader dan Writer.
Coba contoh kode
package main
import "fmt"
type Pengirim interface {
Kirim(pesan string) string
}
type Email struct{}
func (e Email) Kirim(pesan string) string {
return "Email: " + pesan
}
func kirimSemua(p Pengirim, pesan string) {
fmt.Println(p.Kirim(pesan))
}
func main() {
kirimSemua(Email{}, "Halo!")
}Email tidak pernah menyatakan hubungannya dengan Pengirim — keberadaan method Kirim yang bertanda sama sudah cukup. Berkat itu, kirimSemua menerima Email hari ini dan tipe lain besok (misalnya SMS) tanpa perubahan sedikit pun pada fungsinya; inilah yang membuat interface terasa seperti colokan universal.
Type assertion dan type switch
func jelaskan(x any) string {
switch v := x.(type) {
case int:
return fmt.Sprintf("angka %d", v)
case string:
return fmt.Sprintf("teks %q sepanjang %d", v, len(v))
case []byte:
return "deretan byte"
default:
return "tipe lain"
}
}
func main() {
fmt.Println(jelaskan(42), jelaskan("go"))
}Type switch memeriksa tipe dinamis nilai interface cabang per cabang — variabel v di tiap cabang sudah bertipe tepat, tanpa perlu assertion lagi. Bentuk satu kali: n, ok := x.(int) mengembalikan nilai dan keberhasilan; ok false berarti tipenya bukan int.
Latihan singkat
Uji: buat struct SMS dengan method Kirim lalu kirim lewat []Pengirim — harus dua baris persis: `Email: Halo!` lalu `SMS: Halo!`.