Pelajaran modul (2/5)
Nilai nol dan ketik konversi
Di Go, setiap variabel yang dideklarasikan tanpa nilai eksplisit menerima a
nilai nol: "nilai netral" dari jenisnya. Ini perbedaan yang sangat besar
dari JavaScript, di mana let x; menghasilkan undefined, atau C, di mana Anda mengakhiri
dengan memori sampah. Tidak ada undefined, tidak ada UB: nol saja.
Tabel nilai nol
| Kategori | Ketik | Nilai nol |
|---|---|---|
| Numerik | int, int64, float32, float64, uint, ... | 0 |
| Boolean | bool | false |
| Tali | string | "" (string kosong) |
| Penunjuk | *T | nil |
| Irisan / Peta / Saluran | []T, map[K]V, chan T | nil |
| Fungsi / Antarmuka | func(...), interface{...} | nil |
| Struktur | T struct{...} | semua bidang pada nilai nol |
var i int // 0
var f float64 // 0
var s string // ""
var b bool // false
var p *int // nil
var nums []int // nil (NB: una slice nil ha len 0 e si può iterare!)Konversi SELALU eksplisit
Tidak seperti C, Python, atau JS, Go tidak secara otomatis mempromosikan hal tersebut
tipe numerik ke tipe lain: Anda harus menulis type(value).
i := 42
var f float64 = float64(i)
var u uint = uint(i)Hal ini berlaku bahkan untuk tipe yang "kompatibel" seperti int dan int64: an
konversi eksplisit selalu diperlukan.
var a int = 10
var b int64 = int64(a) // obbligatorioKonversi antar angka: hati-hati terhadap pemotongan
Beralih dari float64 ke int terpotong menuju nol, tidak
bulat:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4Konversi string ↔ angka
string(65) TIDAK memberikan "65": ia memberikan "A" (rune dengan kode
poin 65). Untuk string → angka dan sebaliknya Anda memerlukan strconv
paket:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilKami akan membahasnya secara mendalam di modul Stdlib.
Giliranmu
Deklarasikan penghitung variabel bertipe int tanpa menginisialisasinya dan mencetaknya. Diharapkan: 0.
Tunjukkan petunjuk
Tanpa penginisialisasi, variabel mengambil nilai nol dari tipenya.
Solusi tersedia setelah 3 upaya
Mengingat bilangan bulat n=10, ubah n menjadi float64 dan bagi dengan 4. Cetak hasilnya (diharapkan 2,5).
Tunjukkan petunjuk
Tanpa konversi eksplisit, `n / 4` adalah pembagian bilangan bulat yang menghasilkan 2.
Solusi tersedia setelah 3 upaya
Apa yang dicetak kode ini?
f := 3.7
fmt.Println(int(f))Rekap
- Setiap tipe memiliki nilai nol yang konsisten: tidak ada
undefined, tidak ada UB. - Slice/map/chan/func/interface/pointer memiliki nilai nol
nil. - Konversi numerik selalu eksplisit dengan
type(value). int(float)terpotong menuju nol; untuk membulatkan gunakanmath.Round.- Untuk string ↔ nomor gunakan paket
strconv(BUKAN cast langsung).