diesem Code:-umspannen String slice inkonsistent
import "fmt"
import "time"
func main() {
string_slice:=[]string{"a","b","c"}
for _,s:=range string_slice{
go func(){
time.Sleep(1*time.Second)
fmt.Println(s)
}()
}
time.Sleep(3*time.Second)
}
erzeugt die Ausgabe "ccc", während dieser Code:
import "fmt"
func main() {
string_slice:=[]string{"a","b","c"}
for _,s:=range string_slice{
s="asd"
fmt.Println(s)
}
fmt.Println(string_slice)
}
erzeugt die Ausgabe "[abc]"
The Der erste würde vorschlagen, dass für den Bereich über Referenzen (die es nicht sollte) iteriert, und der zweite schlägt vor, dass es über Kopien von Werten iteriert (was es sollte).
Warum produziert der erste nicht die Ausgabe "a b c"?
was der Punkt der zweiten ist? Sie drucken nur die ganze Scheibe, nachdem Sie "" asd "' 3 mal gedruckt haben. https://play.golang.org/p/rNEGrgS3AT – mkopriva
https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables –
https://golang.org/ doc/faq # closures_and_goroutines – JimB