Lompati ke konten utama
Modul 6 · Pelajaran 3 dari 528/50 dalam kursus~10 min
Pelajaran modul (3/5)

Ketik saklar

Saklar tipe membedakan beberapa kemungkinan tipe dari sebuah nilai antarmuka. Ini adalah generalisasi dari comma ok padahal ada lebih dari satu kasus.

Sintaksis

Go
func describe(i interface{}) string {
    switch v := i.(type) {
    case int:
        return fmt.Sprintf("int %d", v)
    case string:
        return fmt.Sprintf("string %q", v)
    case nil:
        return "nil"
    default:
        return fmt.Sprintf("altro tipo: %T", v)
    }
}
  • i.(type) adalah sintaks khusus, HANYA valid di dalam switch.
  • v := ... mengikat nilai dengan tipe kasus saat ini: di dalam case int, v memiliki tipe int.
  • default menangkap semua jenis lainnya; di sana v memiliki tipe antarmuka asli.
  • case nil cocok dengan antarmuka dengan tipe dinamis nihil.

Kasus "Tanpa Nama".

Jika Anda tidak memerlukan nilai yang diketik, Anda dapat menghilangkan v:

Go
switch i.(type) {
case int:
    // you know it's an int, but you don't have a variable of that type
case string:
    // ...
}

Formulir yang digunakan ketika Anda hanya perlu membedakan jenisnya, bukan pengoperasiannya pada nilainya.

Beberapa jenis dalam kasus yang sama

Go
switch v := i.(type) {
case int, int64:
    // here v is still interface{}: the "common" type is just the interface
    fmt.Println("numero intero:", v)
case string:
    // here v is string
    fmt.Println("stringa:", v)
}

Kasus penggunaan umum: pencetakan berformat

Go
func print(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("%d\n", v)
    case string:
        fmt.Printf("%s\n", v)
    case fmt.Stringer:
        fmt.Println(v.String())
    default:
        fmt.Printf("%v\n", v)
    }
}

fmt.Println sendiri menggunakan saklar tipe secara internal untuk menanganinya format standar.

Ketik saklar vs refleksi

Untuk beberapa tipe yang diketahui → ketik switch (cepat, mudah dibaca). Untuk inspeksi dinamis dari tipe yang tidak diketahui → paket reflect (selengkapnya kuat tetapi lebih lambat dan lebih bertele-tele).

Cobalah

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

Implementasikan stringdeskripsikan(i interface{}) yang mengembalikan 'int', 'string', atau 'altro' bergantung pada tipe dinamisnya.

Memuat editor…
Tunjukkan petunjuk

Sintaks: `switch i.(type) { case T: ... default: ... }`.

Solusi tersedia setelah 3 upaya

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

Tulis printVal(i interface{}) yang menggunakan v := i.(type) dan mencetak dengan %d untuk int, %s untuk string.

Memuat editor…
Tunjukkan petunjuk

Di dalam `case int`, v memiliki tipe int (Anda dapat meneruskannya ke Printf).

Solusi tersedia setelah 3 upaya

Quiz#go.m6.l3.e3
Siap

Sintaks mana yang memulai peralihan tipe?

Go
switch ??? {
  case int: ...
}
Pilihan jawaban

Rekap

  • switch v := i.(type) { case T: ... }: membedakan tipe dinamis.
  • Di dalam case tipe tunggal, v memiliki tipe case.
  • case T1, T2: v mempertahankan tipe antarmuka asli.
  • default untuk kasus yang tidak tertangani; case nil untuk antarmuka nihil.
  • Tidak ada fallthrough pada sakelar tipe.
  • 1 tipe → ketik pernyataan; 2+ tipe → tipe sakelar.