Go в примери: Обход на вградени видове с range

range извършва последователно повтарящо се действие върху всеки член от подадения му набор от вградени видове структури от данни. Да видим как да ползваме range с някои от видовете данни, които вече знаем.

package main
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.


  1. Уникод – https://bg.wikipedia.org/wiki/Уникод
    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 а

Следващ пример: .