← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 23

Any / interface kosong

Tipe yang ditempati semua nilai — dan kapan memakainya.

Pahami konsepnya

Interface tanpa method sama sekali disebut interface kosong: interface{}. Sejak Go 1.18, nama pendeknya adalah any. Karena kontraknya kosong, semua tipe memenuhinya. Contoh memakai interface{} agar dapat dijalankan dengan compiler Go 1.13 di situs ini.

fmt.Println dapat menerima nilai dengan tipe berbeda dalam satu panggilan. Pada Go modern parameternya ditulis ...any; pada Go lama bentuk setaranya ...interface{}. Untuk koleksi campuran juga ada []interface{} atau []any pada Go modern.

Sebelum menggunakan nilainya sebagai tipe konkret, periksa dengan type assertion atau type switch. Jika tipe bisa dipastikan sejak awal, gunakan tipe konkret atau generics pada Go 1.18+.

Coba contoh kode

package main

import "fmt"

func tampilSemua(nilai ...interface{}) {
    for _, v := range nilai {
        fmt.Print(v, " ")
    }
    fmt.Println()
}

func main() {
    tampilSemua("umur", 17, 55.5, true, []int{1, 2})
}

Satu panggilan tampilSemua menampung lima nilai bertipe berbeda karena parameter ...any. Di dalam loop, tiap v bertipe any — bisa dicetak, tetapi untuk dihitung atau dibandingkan perlu dikembalikan ke tipe aslinya dulu lewat assertion.

Menarik tipe kembali dari any

package main

import (
    "fmt"
    "strings"
)

func main() {
    var data interface{} = 42

    if n, ok := data.(int); ok {
        fmt.Println("angka:", n*2) // angka: 84
    }

    data = "golang"
    if s, ok := data.(string); ok {
        fmt.Println("teks:", strings.ToUpper(s)) // teks: GOLANG
    }
}

Bentuk dua nilai data.(int) mengembalikan isi plus keberhasilan — ok false tidak membuat program jatuh, hanya berarti tipenya bukan int. Pola ini adalah satu-satunya jalan aman membongkar isi any.

Latihan singkat

Uji: jumlahkan hanya elemen bertipe int lewat type assertion — program harus mencetak persis `59`.