кода является следующий вид:идут для диапазона среза и метод goroutine вызова, логика
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)
}
Я знаю, что код не так, потому что цикл переменная повторно используется в цикле для диапазона ,
Когда у goroutine появилась возможность запуска, значение v
могло быть изменено. поэтому результат печати будет "three,three,three"
.
Но когда мы изменяем переменные данные в другую декларацию, как:
data := []*field{{"one"},{"two"},{"three"}}
результат печати будет "one ,two,three"
.
Я не понял, почему. Является ли указатель какой-либо разницей или каким-либо другим механизмом?
Я прочитал это от this article. Но плакат не сказал, почему. Или это просто случай, выход правильный.
Я не вижу, как «данные» определяются разными во второй раз. –
@ LutzHorn извините за опечатку и вашу неверность. первый неверный случай, данные определяются как «data: = [] field {{« one »}, {« two »}, {" three "}}", а новое одно: data: = [] * field { {"one"}, {"two"}, {"three"}} " – cilendeng
Пожалуйста, отредактируйте ваш вопрос и исправьте код. –