Asersi Tipe dan Switch Tipe
Asersi tipe yang aman dan pola switch
Asersi Tipe dan Switch Tipe adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Pernyataan Tipe
Pernyataan tipe mengekstrak nilai konkret dari antarmuka. Sintaksnya adalah x.(T):
package main
import "fmt"
func main() {
var i interface{} = "hello"
s := i.(string) // panics if wrong type
fmt.Println(s, len(s)) // hello 5
}Pernyataan Dua Nilai yang Aman
Gunakan bentuk koma-ok untuk menghindari kepanikan pada tipe yang salah:
package main
import "fmt"
func main() {
var i interface{} = 42
s, ok := i.(string)
fmt.Println(s, ok) // "" false
n, ok := i.(int)
fmt.Println(n, ok) // 42 true
}Pemeriksaan Tipe
Pemeriksaan tipe membandingkan tipe dinamis suatu nilai antarmuka dengan beberapa tipe:
package main
import "fmt"
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 bool: return fmt.Sprintf("bool: %v", v)
default: return fmt.Sprintf("unknown: %T", v)
}
}
func main() {
fmt.Println(describe(42))
fmt.Println(describe("hi"))
fmt.Println(describe(3.14))
}Pemeriksaan Tipe pada error
Pemeriksaan tipe sangat berguna untuk mengelompokkan kesalahan:
package main
import ("errors"; "fmt")
type NotFoundError struct{ Name string }
func (e *NotFoundError) Error() string { return e.Name + " not found" }
type PermError struct{}
func (e *PermError) Error() string { return "permission denied" }
func handle(err error) {
switch e := err.(type) {
case *NotFoundError: fmt.Println("missing:", e.Name)
case *PermError: fmt.Println("perm error")
default: fmt.Println("other:", e)
}
}
func main() {
handle(&NotFoundError{"user"})
handle(errors.New("generic"))
}Pernyataan ke Antarmuka
Anda dapat melakukan pernyataan ke tipe antarmuka lain, bukan hanya tipe konkret. Ini berguna untuk memeriksa apakah suatu objek mendukung perilaku opsional:
package main
import "fmt"
type Flusher interface{ Flush() }
type Writer interface{ Write(string) }
type BufferedWriter struct{ buf string }
func (b *BufferedWriter) Write(s string) { b.buf += s }
func (b *BufferedWriter) Flush() { fmt.Println(b.buf); b.buf = "" }
func maybeFlush(w Writer) {
if f, ok := w.(Flusher); ok { f.Flush() }
}
func main() {
bw := &BufferedWriter{}
bw.Write("hello")
maybeFlush(bw)
}Pernyataan pada Antarmuka Nil
Melakukan pernyataan pada antarmuka nil menyebabkan kepanikan. Selalu pastikan antarmuka tidak nil sebelum melakukan pernyataan:
package main
import "fmt"
func safePrint(i interface{}) {
if i == nil {
fmt.Println("nil")
return
}
fmt.Printf("%T: %v\n", i, i)
}
func main() {
safePrint(nil)
safePrint(42)
}Alternatif reflect.TypeOf
Untuk mencetak tipe tanpa melakukan pernyataan, gunakan fmt.Sprintf("%T", v) atau reflect.TypeOf(v):
package main
import ("fmt"; "reflect")
func main() {
v := []int{1, 2, 3}
fmt.Printf("%T\n", v) // []int
fmt.Println(reflect.TypeOf(v)) // []int
}Afirmasi Tipe vs Konversi
Afirmasi tipe: mengambil tipe konkret dari antarmuka. Konversi tipe: mengubah satu tipe konkret menjadi tipe kompatibel lainnya. Keduanya merupakan operasi yang berbeda:
package main
import "fmt"
func main() {
var i interface{} = int32(5)
n := i.(int32) // assertion — OK
big := int64(n) // conversion — OK
fmt.Println(n, big)
}Pola Koma-ok dalam select
Pola koma-ok juga berlaku pada penerimaan dari kanal untuk mendeteksi kanal yang ditutup. Idiom ringkas yang sama digunakan secara konsisten di Go.
Kapan Menggunakan Percabangan Tipe
Kasus penggunaan umum:
- Penguraian JSON dengan bidang
interface{} - Pengategorian galat
- Pengiriman pesan protokol
- Pemeriksaan antarmuka opsional (Flusher, Closer, dll.)
Pemeriksaan Singkat
Apa hasil dari afirmasi tipe non-aman yang gagal?
Ringkasan
Hal-hal penting:
x.(T)memicu panic pada tipe yang salah;x, ok := x.(T)aman- Percabangan tipe menangani beberapa tipe dengan rapi
- Lakukan afirmasi ke antarmuka untuk memeriksa kemampuan opsional
- Jangan pernah melakukan afirmasi pada antarmuka nil
Instruksi Latihan
Tulislah fungsi sum(values []any) float64 yang menggunakan percabangan tipe untuk menangani nilai int, float64, dan string (mengurai string), serta melewati nilai lainnya.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Asersi Tipe dan Switch Tipe” gratis?
Ya — teks lengkap “Asersi Tipe dan Switch Tipe” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Asersi Tipe dan Switch Tipe”?
Asersi tipe yang aman dan pola switch Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Asersi Tipe dan Switch Tipe” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mendefinisikan dan Mengimplementasikan Interface
- Interface Pustaka Standar Inti
- Asersi Tipe dan Switch Tipe
- Komposisi Interface dan Praktik Terbaik