π¬Π ΡΠ΅ΠΌ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ½ΡΠΌ ΠΈ Π³Π»ΡΠ±ΠΎΠΊΠΈΠΌ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π² Go?
πΠΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (shallow copy) ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΡΠ΅ ΠΆΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΡΡΠΎ ΠΈ ΠΈΡΡ ΠΎΠ΄Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ/ΡΡΡΡΠΊΡΡΡΠ°.
β’ ΠΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π½ΠΎ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ, ΠΈ Π½Π°ΠΌ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π»ΠΈΡΠ»ΠΈ Π½Π° Π΄ΡΡΠ³ΡΡ.
πΠΠ»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (deep copy) ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅, ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠ΅ ΠΊΠΎΠΏΠΈΠΈ Π΄Π°Π½Π½ΡΡ , ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ ΡΡ Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ ΡΡΡΡΠΊΡΡΡΠ΅.
β’ ΠΠ»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²Π°ΠΆΠ½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΌΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ , Π³Π΄Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²Π»ΠΈΡΡΡ Π½Π° ΡΠ΅Π»ΡΡ ΡΡΡΡΠΊΡΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠΏΠΈΠΈ ΡΡΡΡΠΊΡΡΡΡ.
πΠΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (shallow copy) ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΡΠ΅ ΠΆΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΡΡΠΎ ΠΈ ΠΈΡΡ ΠΎΠ΄Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ/ΡΡΡΡΠΊΡΡΡΠ°.
β’ ΠΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π½ΠΎ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ, ΠΈ Π½Π°ΠΌ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π»ΠΈΡΠ»ΠΈ Π½Π° Π΄ΡΡΠ³ΡΡ.
original := []int{1, 2, 3}
copied := original
copied[0] = 99
fmt.Println(original)
// [99 2 3]πΠΠ»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (deep copy) ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅, ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠ΅ ΠΊΠΎΠΏΠΈΠΈ Π΄Π°Π½Π½ΡΡ , ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ ΡΡ Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ ΡΡΡΡΠΊΡΡΡΠ΅.
β’ ΠΠ»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²Π°ΠΆΠ½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΌΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ , Π³Π΄Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²Π»ΠΈΡΡΡ Π½Π° ΡΠ΅Π»ΡΡ ΡΡΡΡΠΊΡΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠΏΠΈΠΈ ΡΡΡΡΠΊΡΡΡΡ.
import "github.com/mohae/deepcopy"
original := []int{1, 2, 3}
copied := deepcopy.Copy(original)
copied[0] = 99
fmt.Println(original)
// [1 2 3]