Ana içeriğe geç
Modül 2 · Ders 3 ders 5Kurstaki 8/50~10 min
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:

Go
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:

Go
// 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:

Go
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.

Go
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:

Go
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:

Go
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

Egzersiz#go.m2.l3.e1
Denemeler: 0Yükleniyor…

for-range kullanarak nums'un her öğesinin indeksini ve değerini yazdırın.

Düzenleyici yükleniyor…

3 denemeden sonra çözüm mevcut

Egzersiz#go.m2.l3.e2
Denemeler: 0Yükleniyor…

Dizini yok sayarak sayıların tüm değerlerini toplam olarak toplayın.

Düzenleyici yükleniyor…
İpucu göster

Dizini atmak için `_` kullanın.

3 denemeden sonra çözüm mevcut

Quiz#go.m2.l3.e3
Hazır

m bir harita olduğunda "k, v := aralık m" içindeki ilk değişken neyi temsil eder?

Go
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }
Cevap seçenekleri

Özet

  • for k, v := range coll kapsamı 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ı.