Modül dersleri (3/5)
... aralığı için
for ... range koleksiyonlar üzerinde yineleme yapmanın deyimsel yoludur:
dilimler, diziler, haritalar, dizeler ve kanallar. Sözdizimi biraz değişir
koleksiyona bağlı olarak değişir, ancak temel desen her zaman aynıdır:
for key, value := range coll { ... }.
Dilimler ve dizilerdeki aralık
dizin ve değerin kopyasını döndürür:
nums := []int{10, 20, 30}
for i, v := range nums {
fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30Çoğu zaman ikisinden biri yeterlidir:
// solo indice
for i := range nums { _ = i }
// solo valore (ignora indice con _)
for _, v := range nums { _ = v }Haritadaki aralık
anahtar ve değer değerini döndürür:
prices := map[string]int{"pane": 2, "latte": 3, "vino": 8}
for k, v := range prices {
fmt.Println(k, v)
}Bir dizedeki aralık: runelar, baytlar değil
for i, r := range s Unicode kod noktasına (rune) göre yinelenir,
bayt. i dizini runenin başlangıcının bayt uzaklığıdır.
for i, r := range "èé" {
fmt.Printf("%d %c (%U)\n", i, r, r)
}
// 0 è (U+00E8)
// 2 é (U+00E9)Bayt başına yineleme yapmak için klasik indekslemeyi kullanın:
s := "ciao"
for i := 0; i < len(s); i++ {
fmt.Println(s[i]) // byte (uint8)
}Bir kanaldaki aralık
Kanal kapatılıncaya kadar yinelenir:
ch := make(chan int)
go func() {
for i := 0; i < 3; i++ { ch <- i }
close(ch)
}()
for v := range ch {
fmt.Println(v)
}Eşzamanlılık modülünde daha derinlere ineceğiz.
Deneyin
for-range kullanarak nums'un her öğesinin indeksini ve değerini yazdırın.
3 denemeden sonra çözüm mevcut
Dizini yok sayarak sayıların tüm değerlerini toplam olarak toplayın.
İpucu göster
Dizini atmak için `_` kullanın.
3 denemeden sonra çözüm mevcut
m bir harita olduğunda "k, v := aralık m" içindeki ilk değişken neyi temsil eder?
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }Özet
for k, v := range collkapsamı net olarak: kullanmadıklarınızı_ile atın.- Dilim/dizi: dizin + değerin KOPYALANMASI. Mutasyona uğratmak için indeksleyin.
- Harita: anahtar + değer, her çalıştırmada rastgele sıralayın.
- Dize: aralık, bayt başına değil, rune (kod noktası) başına yinelenir.
- Kanal: kanal açıkken yinelenir;
close()ile kapatıldı.