Modül dersleri (2/5)
Sıfır değer ve tür dönüşümleri
Go'da açık bir değer olmadan bildirilen her değişken bir
sıfır değer: türünün "nötr değeri". Bu çok büyük bir fark
let x;'nin undefined ürettiği JavaScript'ten veya bitirdiğiniz C'den
çöp hafızasıyla dolu. undefined yok, UB yok: yalnızca sıfır.
Sıfır değer tablosu
| Kategori | Tür | Sıfır değer |
|---|---|---|
| Sayısal | int, int64, float32, float64, uint, ... | 0 |
| Boolean | bool | false |
| Dize | string | "" (boş dize) |
| İşaretçi | *T | nil |
| Dilim / Harita / Kanal | []T, map[K]V, chan T | nil |
| Fonksiyon / Arayüz | func(...), interface{...} | nil |
| Yapı | T struct{...} | tüm alanlar sıfır değerinde |
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!)Dönüşümler HER ZAMAN açıktır
C, Python veya JS'den farklı olarak Go, birini otomatik olarak tanıtmaz
sayısal türü diğerine: type(value) yazmalısınız.
i := 42
var f float64 = float64(i)
var u uint = uint(i)Bu, int ve int64 gibi "uyumlu" türler için bile geçerlidir:
açık dönüşüm her zaman gereklidir.
var a int = 10
var b int64 = int64(a) // obbligatorioSayılar arasında dönüştürme: kesilmelere dikkat edin
float64'den int'ye gidildiğinde sıfıra doğru kesilir,
yuvarlak:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4Dize ↔ sayı dönüşümü
string(65) "65" VERMEZ: "A" verir (kodlu rune)
nokta 65). Dize → sayı için ve tam tersi için strconv'ye ihtiyacınız vardır.
paket:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilBunu Stdlib modülünde derinlemesine ele alacağız.
Sıra sende
İnt türünde değişken bir sayacı başlatmadan bildirin ve yazdırın. Beklenen: 0.
İpucu göster
Başlatıcı olmadan değişken türün sıfır değerini alır.
3 denemeden sonra çözüm mevcut
n=10 tamsayısını verildiğinde, n'yi float64'e dönüştürün ve 4'e bölün. Sonucu yazdırın (beklenen 2,5).
İpucu göster
Açık dönüştürme olmadan, 'n / 4' 2'yi veren bir tamsayı bölümüdür.
3 denemeden sonra çözüm mevcut
Bu kod ne yazdırıyor?
f := 3.7
fmt.Println(int(f))Özet
- Her türün tutarlı bir sıfır değeri vardır:
undefinedyok, UB yok. - Dilim/harita/kanal/işlev/arabirim/işaretçinin değeri sıfırdır
nil. - Sayısal dönüşümler
type(value)ile her zaman açıktır. int(float)sıfıra doğru kısalır; yuvarlamak içinmath.Roundkullanın.- String ↔ number için
strconvpaketini kullanın (doğrudan dönüşüm DEĞİLDİR).