Код выглядит следующим образом:
package main
import (
"fmt"
"time"
)
type field struct {
name string
}
func (p *field) print() {
fmt.Println(p.name)
}
func main() {
data := []field{{"one"},{"two"},{"three"}}
for _,v := range data {
go v.print()
}
time.Sleep(3 * time.Second)
}
Я знаю, что код неверен, потому что переменная цикла for повторно используется в цикле for-range.
Когда горутине удалось запуститься, значение v
may было изменено. поэтому результат печати будет "three,three,three"
.
Но когда мы изменяем переменную данных в другое объявление как:
data := []*field{{"one"},{"two"},{"three"}}
результат печати будет "one ,two,three"
.
Я не понял, почему. Имеет ли значение указатель или какой-либо другой механизм?
Я прочитал это из этой статьи. Но плакат не сказал, почему. Или это просто случай, выход правильный.
data
определяется по-другому во второй раз. - person   schedule 01.06.2015