πŸ’¬ КакиС ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΡ€ΠΈ создании ΠΊΠΎΠΏΠΈΠΈ срСзов Π² Go?



πŸ“Œ ВстроСнная функция copy позволяСт ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты ΠΈΠ· исходного срСза Π² Π΄Ρ€ΡƒΠ³ΠΎΠΈΜ†. Рассмотрим Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, которая ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ количСства элСмСнтов.



πŸ”ΈΠ’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм ΠΎΠ΄ΠΈΠ½ срСз, ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ элСмСнты Π² Π΄Ρ€ΡƒΠ³ΠΎΠΈΜ† ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ [] вмСсто [0 1 2]:



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

var dst []int

copy(dst, src)

fmt.Println(dst)





πŸ”ΈΠ§Ρ‚ΠΎΠ±Ρ‹ эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ copy, Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ число элСмСнтов, скопированных Π² Π΄Ρ€ΡƒΠ³ΠΎΠΈΜ† срСз, опрСдСляСтся ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ: Π΄Π»ΠΈΠ½ΠΎΠΈΜ† исходного срСза ΠΈ Π΄Π»ΠΈΠ½ΠΎΠΈΜ† Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ срСза.



πŸ”ΈΠ’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ src β€” это срСз Π΄Π»ΠΈΠ½ΠΎΠΈΜ† 3, Π° dst β€” срСз с Π½ΡƒΠ»Π΅Π²ΠΎΠΈΜ† Π΄Π»ΠΈΠ½ΠΎΠΈΜ†, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ инициализируСтся со своим Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ функция copy ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ количСство элСмСнтов, Ρ€Π°Π²Π½ΠΎΠ΅ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ Π² Π½Π°Π±ΠΎΡ€Π΅ 3 ΠΈ 0: здСсь этот ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 0. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΈΜ† срСз Π±ΡƒΠ΄Π΅Ρ‚ пустым.



πŸ”ΈΠ•ΡΠ»ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π²Ρ‚ΠΎΡ€ΠΎΠΈΜ† срСз Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΡƒΡŽ Π΄Π»ΠΈΠ½Π΅ исходного. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ устанавливаСм Π΄Π»ΠΈΠ½Ρƒ, ΠΎΡ‚Ρ‚Π°Π»ΠΊΠΈΠ²Π°ΡΡΡŒ ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² исходного срСза:



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

dst := make([]int, len(src))

copy(dst, src)

fmt.Println(dst)





πŸ”ΈΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ dst Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ срСз, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΈΜ† с Π΄Π»ΠΈΠ½ΠΎΠΈΜ†, Ρ€Π°Π²Π½ΠΎΠΈΜ† 3, Ρ‚ΠΎ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ элСмСнта. На этот Ρ€Π°Π· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ [012].



πŸ’‘Π”Ρ€ΡƒΠ³Π°Ρ распространСнная ошибка β€” ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ порядок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ copy. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ срСз, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΈΜ† происходит ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΈΜ† Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π° срСз-источник β€” Π²Ρ‚ΠΎΡ€ΠΎΠΈΜ†.



πŸ”ΉΠ˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ copy β€” Π½Π΅ СдинствСнный способ копирования элСмСнтов срСза. Π•ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹:



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

dst := append([]int(nil), src...)





πŸ”ΉΠœΡ‹ добавляСм элСмСнты ΠΈΠ· исходного срСза Π² Π΄Ρ€ΡƒΠ³ΠΎΠΈΜ†, Π½ΡƒΠ»Π΅Π²ΠΎΠΈΜ†. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, этот ΠΊΠΎΠ΄ создаСт копию срСза Π΄Π»ΠΈΠ½ΠΎΠΈΜ† 3 ΠΈ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒΡŽ 3. Однако использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ copy Π±ΠΎΠ»Π΅Π΅ ΠΈΠ΄ΠΈΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π»Π΅Π³Ρ‡Π΅ для понимания, Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большС ΠΊΠΎΠ΄Π°.