range извършва последователно повтарящо се действие
върху всеки член от подадения му набор от вградени
видове структури от данни. Да видим как да ползваме
range с някои от видовете данни, които вече знаем.
import "fmt"
func main() {
Тук ползваме действието range (обхождане), за да
съберем последователно числата от даден отрязък.
С поредиците работим по същия начин.
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
При обхождането на поредици и отрязъци range връща едновременно показалец и стойност за всеки следващ член. По-горе не ни беше нужен показалеца и го пренебрегнахме, като присвоихме стойността му на празното наименование _. В други случаи показалецът ни е нужен.
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
При обход с range на карти на всяка стъпка
получaваме двойка ключ/стойност.
kvs := map[string]string{"я": "ябълка", "б": "банан"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
С range също така можем да обходим само ключовете
в дадена карта.
for k := range kvs {
fmt.Println("ключ:", k)
}
Когато обхождаме низове с range, на всяка стъпка
получаваме мястото на следващия знак в таблицата
Уникод1. Първата стойност е показалец за
мястото в низа на началният байт от следващия знак
(rune – руна), а втората е самият знак – rune.
Вижте Низове и Руни, за повече
подробности. Тук обхождаме стойността, която връща
ключа я от картата kvs.
for i, c := range kvs["я"] {
За да видим самата буква, трябва да я ползваме
като низ – string.
fmt.Println(i, c, string(c))
}
}
$ go run range-over-built-in-types.go
sum: 9
index: 1
я -> ябълка
б -> банан
ключ: я
ключ: б
0 1103 я
2 1073 б
4 1098 ъ
6 1083 л
8 1082 к
10 1072 а
Следващ пример: Указатели.