πŸ’¬ КакиС ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ†ΠΈΠΊΠ»ΠΎΠΌ range Π² Go?



πŸ“Œ Бинтаксис Ρ†ΠΈΠΊΠ»Π° range Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия выраТСния. НапримСр, Π² Ρ†ΠΈΠΊΠ»Π΅ for i, v := range exp, exp β€” это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ строка, массив, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив, срСз, map ΠΈΠ»ΠΈ ΠΊΠ°Π½Π°Π».



β—† Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³Π΄Π΅ ΠΊ срСзу добавляСтся элСмСнт, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ выполняСм ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ.



πŸ€” Π—Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π»ΠΈ этот Ρ†ΠΈΠΊΠ»?



s := []int{0, 1, 2}

for range s {

s = append(s, 10)

}





β—† Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΡΡƒΡ‚ΡŒ, слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании Ρ†ΠΈΠΊΠ»Π° range ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ вычисляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· β€” ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π°.



β—† Π’ этом контСкстС слово «вычисляСтся» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ прСдоставлСнноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ копируСтся Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ†ΠΈΠΊΠ» range выполняСт ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈ вычислСнии выраТСния s Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ копия срСза. Π¦ΠΈΠΊΠ» range ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΈΜ† срСз s Ρ‚Π°ΠΊΠΆΠ΅ обновляСтся Π²ΠΎ врСмя ΠΊΠ°ΠΆΠ΄ΠΎΠΈΜ† ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ.



β—† ΠšΠ°ΠΆΠ΄Ρ‹ΠΈΜ† шаг ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ добавлСнию Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта. Но Π·Π° Ρ‚Ρ€ΠΈ шага ΠΌΡ‹ ΠΏΡ€ΠΎΡˆΠ»ΠΈΡΡŒ ΠΏΠΎ всСм Π΅Π³ΠΎ элСмСнтам. Π”Π»ΠΈΠ½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ срСза, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² range, остаСтся Ρ€Π°Π²Π½Π° 3, поэтому Ρ†ΠΈΠΊΠ» Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ послС Ρ‚Ρ€Π΅Ρ… ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈΜ†.



β—† Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ отличаСтся ΠΎΡ‚ классичСского Ρ†ΠΈΠΊΠ»Π° for:



s := []int{0, 1, 2}

for i := 0; i < len(s); i++ {

s = append(s, 10)

}





β—† Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ†ΠΈΠΊΠ» Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ закончится. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния len(s) вычисляСтся Π²ΠΎ врСмя ΠΊΠ°ΠΆΠ΄ΠΎΠΈΜ† ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΈ Ρ€Π°Π· ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ элСмСнты, Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ достигнСм состояния Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ†ΠΈΠΊΠ»Π°.



πŸ’‘ Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ»Ρ‹ Π² Go, Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΠ± этой Ρ€Π°Π·Π½ΠΈΡ†Π΅. ΠŸΡ€ΠΈ использовании range ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ вычисляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·) Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊΠΎ всСм Ρ‚ΠΈΠΏΠ°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ….