Функция reflect.Copy

Функция reflect.Copy копирует элементы из исходного слайса (второй аргумент) в целевой слайс (первый аргумент). Возвращает количество скопированных элементов. Копирование ограничивается меньшей длиной из двух слайсов. Эта функция работает на низком уровне и предназначена для использования в коде, работающем с отражением.

Синтаксис

goreflect.Copy(dst, src Value) int

Пример

Давайте скопируем элементы из одного слайса в другой:

gopackage 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)
}

Результат выполнения кода:

go[1 2 3]

Пример

Когда целевой слайс длиннее исходного, копируются только существующие элементы:

gopackage 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)
}

Результат выполнения кода:

go"Copied count: 3"
[a b c  ]

Пример

При копировании между слайсами разных типов необходимо использовать преобразование через reflect.Convert:

gopackage 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)
}

Результат выполнения кода:

go[1 2 3]

Смотрите также

  • функцию reflect.Append,
    которая добавляет элементы в конец слайса
  • функцию reflect.AppendSlice,
    которая добавляет один слайс к другому
  • функцию reflect.MakeSlice,
    которая создает новый слайс указанного типа и размера
  • функцию reflect.Value.Len,
    которая возвращает длину слайса или массива