Функция reflect.Copy
Функция reflect.Copy копирует элементы из исходного слайса (второй аргумент)
в целевой слайс (первый аргумент). Возвращает количество скопированных элементов.
Копирование ограничивается меньшей длиной из двух слайсов.
Эта функция работает на низком уровне и предназначена для использования
в коде, работающем с отражением.
Синтаксис
reflect.Copy(dst, src Value) int
Пример
Давайте скопируем элементы из одного слайса в другой:
package main
import (
"fmt"
"reflect"
)
func main() {
src := []int{1, 2, 3, 4, 5}
dst := make([]int, 3)
reflect.Copy(reflect.ValueOf(dst), reflect.ValueOf(src))
fmt.Println(dst)
}
Результат выполнения кода:
[1 2 3]
Пример
Когда целевой слайс длиннее исходного, копируются только существующие элементы:
package main
import (
"fmt"
"reflect"
)
func main() {
src := []string{"a", "b", "c"}
dst := make([]string, 5)
count := reflect.Copy(reflect.ValueOf(dst), reflect.ValueOf(src))
fmt.Println("Copied count:", count)
fmt.Println(dst)
}
Результат выполнения кода:
"Copied count: 3"
[a b c ]
Пример
При копировании между слайсами разных типов необходимо использовать преобразование через reflect.Convert:
package main
import (
"fmt"
"reflect"
)
func main() {
src := []int{1, 2, 3, 4, 5}
dst := make([]float64, 3)
for i := 0; i < len(src) && i < len(dst); i++ {
val := reflect.ValueOf(src[i])
dst[i] = val.Convert(reflect.TypeOf(dst[i])).Interface().(float64)
}
fmt.Println(dst)
}
Результат выполнения кода:
[1 2 3]
Смотрите также
-
функцию
reflect.Append,
которая добавляет элементы в конец слайса -
функцию
reflect.AppendSlice,
которая добавляет один слайс к другому -
функцию
reflect.MakeSlice,
которая создает новый слайс указанного типа и размера -
функцию
reflect.Value.Len,
которая возвращает длину слайса или массива