Вопрос: Как работает range по slice и почему опасно брать адрес переменной цикла?
Go
Junior
Без компании
Вопрос: Как работает range по slice и почему опасно брать адрес переменной цикла?
Ответы
range копирует элемент в переменную цикла. Переменная одна на итерации (переиспользуется), поэтому &v указывает на одно и то же место.
Плохой пример:
```go
package main
import "fmt"
func main() {
s := []int{10, 20, 30}
ptrs := []*int{}
for _, v := range s {
ptrs = append(ptrs, &v) // ошибка: все адреса одинаковые
}
for _, p := range ptrs {
fmt.Println(*p)
}
}
```
Правильно:
```go
for i := range s {
ptrs = append(ptrs, &s[i])
}
```