Все вопросы

24 Коллекции

Что именно отдаёт range?

По slice range даёт индекс и копию элемента. По строке — байтовый индекс и руну. По карте — ключ и копию значения, в случайном порядке. По каналу — значения, пока канал не закроют.

Раз переменная цикла — копия, n *= 10 не меняет slice. Чтобы изменить элемент, пиши по индексу: nums[i] *= 10.

То же с картой: значение из range — копия. Обновление поля этой копии не попадает обратно в карту, нужна запись m[k] = v.

Пример

Go

копия элемента и запись по индексу

package main

import "fmt"

func main() {
    nums := []int{10, 20, 30}
    for i, n := range nums {
        fmt.Println(i, n)
    }

    for _, n := range nums {
        n *= 10
    }
    fmt.Println("после правки копии", nums)

    for i := range nums {
        nums[i] *= 10
    }
    fmt.Println("после записи по индексу", nums)
}