Многократное присвоение переменной - PullRequest
0 голосов
/ 10 ноября 2019

Приведенный ниже фрагмент кода смутил меня:

v, ok := a[1] // error: assignment count mismatch: 2 = 1

Приведенный выше код вызывает ошибку из-за несоответствия счетчика, но приведенный ниже фрагмент кода работает нормально:

for i, id:= range ids
{
   fmt.Printf("%d - ID: %d\n",i,id)
}

Значит ли это, что range возвращает индекс и значение, благодаря которым приведенный выше фрагмент кода работает нормально?

1 Ответ

1 голос
/ 10 ноября 2019

Форма range цикла for выполняет итерации по срезу или карте.

При определении диапазона по срезу для каждой итерации возвращаются два значения. Первый - это индекс, а второй - копия элемента с этим индексом.

Давайте предположим, что у нас есть функция, которая проверяет, является ли число prime number, и у нас есть массив счисла кандидатов, чем мы можем вызвать функцию двумя различными способами:

var prime []int = []int{2, 3, 5, 7, 11, 13, 17, 19, 23}

func TestIsPrimeByValue(t *testing.T) {
    for _, item := range prime {
        if !IsPrime(item) {
            t.Fail()
        }
    }
}

func TestIsPrimeByIndex(t *testing.T) {
    for i := range prime {
        if !IsPrime(prime[i]) {
            t.Fail()
        }
    }
}

В первом цикле мы перебираем значение массива.
Во втором цикле мы перебираем индексмассива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...