Для копирования срезов (slice) можно использовать встроенную функцию
copy
. Эта функция копирует элементы из одного среза в другой, обеспечивая корректное и эффективное копирование данных. Принимает два аргумента: целевой срез и исходный срез. Она копирует элементы из исходного среза в целевой и возвращает количество скопированных элементов. В этом примере исходный срез
src
копируется в целевой срез dst
. Размер целевого среза должен быть равен или больше размера исходного среза, чтобы все элементы могли быть скопированы.package main
import "fmt"
func main() {
// Исходный срез
src := []int{1, 2, 3, 4, 5}
// Целевой срез, который должен иметь достаточно места для копирования элементов
dst := make([]int, len(src))
// Копирование среза
n := copy(dst, src)
// Вывод результатов
fmt.Println("Исходный срез:", src) // Output: Исходный срез: [1 2 3 4 5]
fmt.Println("Целевой срез:", dst) // Output: Целевой срез: [1 2 3 4 5]
fmt.Println("Количество скопированных элементов:", n) // Output: Количество скопированных элементов: 5
}
Частичное копирование: Если целевой срез меньше исходного,
copy
скопирует только столько элементов, сколько поместится в целевой срез.package main
import "fmt"
func main() {
// Исходный срез
src := []int{1, 2, 3, 4, 5}
// Целевой срез меньшего размера
dst := make([]int, 3)
// Копирование среза
n := copy(dst, src)
// Вывод результатов
fmt.Println("Исходный срез:", src) // Output: Исходный срез: [1 2 3 4 5]
fmt.Println("Целевой срез:", dst) // Output: Целевой срез: [1 2 3]
fmt.Println("Количество скопированных элементов:", n) // Output: Количество скопированных элементов: 3
}
Копирование разных типов: Функция
copy
работает только с срезами одного типа. Если вы попытаетесь копировать элементы между срезами разных типов, это приведет к ошибке компиляции.package main
import "fmt"
func main() {
// Исходный срез
src := []int{1, 2, 3, 4, 5}
// Целевой срез
dst := make([]int, 2)
// Копирование части среза
n := copy(dst, src[1:3])
// Вывод результатов
fmt.Println("Исходный срез:", src) // Output: Исходный срез: [1 2 3 4 5]
fmt.Println("Целевой срез:", dst) // Output: Целевой срез: [2 3]
fmt.Println("Количество скопированных элементов:", n) // Output: Количество скопированных элементов: 2
}
Глубокое копирование срезов с вложенными структурами: Если он содержит сложные структуры данных, такие как структуры или срезы с указателями, вам может понадобиться реализовать глубокое копирование, чтобы копировать не только сами элементы, но и данные, на которые они ссылаются.
package main
import "fmt"
type Item struct {
Value int
}
func main() {
// Исходный срез
src := []Item{{1}, {2}, {3}}
// Целевой срез
dst := make([]Item, len(src))
// Глубокое копирование
for i, item := range src {
dst[i] = Item{Value: item.Value}
}
// Изменение исходного среза не влияет на целевой срез
src[0].Value = 100
// Вывод результатов
fmt.Println("Исходный срез:", src) // Output: Исходный срез: [{100} {2} {3}]
fmt.Println("Целевой срез:", dst) // Output: Целевой срез: [{1} {2} {3}]
}
Ставь 👍 и забирай 📚 Базу знаний