π¬ Π§ΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Ρ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡΠΌΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΌΠΈ ΠΊΠ°ΠΊ Π³ΠΎΡΡΡΠΈΠ½Ρ?
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠΉ Ρ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΡΠ°Π½ΠΈΡΠ°. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠΎΠΆΠ½ΠΎ ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΡΠ²ΠΎΠ΄:
ΠΠΎΠ³Π΄Π° Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, ΠΎΠ½ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
Π§ΡΠΎΠ±Ρ ΠΏΡΠΈΠ²ΡΠ·Π°ΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
ΠΡΠ΅ ΠΏΡΠΎΡΠ΅ β ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΈΠ»Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΡΡΠ°Π½Π½ΡΠΌ, Π½ΠΎ Π² Go ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΎΡΠΎΡΠΎ:
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠΉ Ρ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΡΠ°Π½ΠΈΡΠ°. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ:
func main() {
done := make(chan bool)
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v)
done <- true
}()
}
// ΠΆΠ΄Π΅ΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ Π³ΠΎΡΡΡΠΈΠ½ ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΡ ΠΎΠ΄ΠΎΠΌ
for _ = range values {
<-done
}
}
ΠΠΎΠΆΠ½ΠΎ ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΡΠ²ΠΎΠ΄:
a
, b
, c
. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ c
, c
, c
. ΠΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΡ ΡΠΈΠΊΠ»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ v
, ΡΠ°ΠΊ ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ Π΄Π΅Π»ΠΈΡΡΡ ΡΡΠΎΠΉ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠΠΎΠ³Π΄Π° Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, ΠΎΠ½ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
v
Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ fmt.Println
, Π½ΠΎ v
ΠΌΠΎΠ³Π»Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡΡ Ρ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π·Π°ΠΏΡΡΠΊΠ° Π³ΠΎΡΡΡΠΈΠ½Ρ. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠΌΠΎΡΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ ΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄ΠΎ ΠΈΡ
Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ go vet
.Π§ΡΠΎΠ±Ρ ΠΏΡΠΈΠ²ΡΠ·Π°ΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
v
ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ ΠΏΡΠΈ Π΅Π³ΠΎ Π·Π°ΠΏΡΡΠΊΠ΅, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠΈΠΊΠ» ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Π»Π°ΡΡ Π½ΠΎΠ²Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ. ΠΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² β ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ:for _, v := range values {
go func(u string) {
fmt.Println(u)
done <- true
}(v)
}
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
v
ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π°ΡΠ΅ΠΌ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ u
.ΠΡΠ΅ ΠΏΡΠΎΡΠ΅ β ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΈΠ»Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΡΡΠ°Π½Π½ΡΠΌ, Π½ΠΎ Π² Go ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΎΡΠΎΡΠΎ:
for _, v := range values {
v := v // ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΡ 'v'.
go func() {
fmt.Println(v)
done <- true
}()
}