Функция reflect.AppendSlice

Функция reflect.AppendSlice добавляет все элементы из одного слайса в конец другого слайса. Она принимает два параметра: первым параметром передается значение типа reflect.Value, представляющее целевой слайс, вторым параметром - значение типа reflect.Value, представляющее слайс, элементы которого нужно добавить. Функция возвращает новое значение типа reflect.Value, представляющее результирующий слайс. Важно отметить, что оба аргумента должны быть слайсами одного типа, иначе будет вызвана паника.

Синтаксис

goreflect.AppendSlice(slice, elements)

Пример

Давайте объединим два слайса строк с помощью функции reflect.AppendSlice:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s1 := []string{"a", "b", "c"}
  s2 := []string{"d", "e"}

  val1 := reflect.ValueOf(s1)
  val2 := reflect.ValueOf(s2)

  res := reflect.AppendSlice(val1, val2)

  fmt.Println(res.Interface())
}

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

go[a b c d e]

Пример

Давайте объединим два слайса чисел с помощью функции reflect.AppendSlice:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s1 := []int{1, 2, 3}
  s2 := []int{4, 5, 6}

  val1 := reflect.ValueOf(s1)
  val2 := reflect.ValueOf(s2)

  res := reflect.AppendSlice(val1, val2)

  fmt.Println(res.Interface())
}

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

go[1 2 3 4 5 6]

Пример

Функция reflect.AppendSlice не изменяет исходные слайсы, а создает новый результирующий слайс. Давайте проверим это на примере:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s1 := []string{"a", "b", "c"}
  s2 := []string{"d", "e"}

  val1 := reflect.ValueOf(s1)
  val2 := reflect.ValueOf(s2)

  res := reflect.AppendSlice(val1, val2)

  fmt.Println("Original s1:", s1)
  fmt.Println("Original s2:", s2)
  fmt.Println("Result:", res.Interface())
}

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

go"Original s1: [a b c]"
"Original s2: [d e]"
"Result: [a b c d e]"

Пример

Попытка объединить слайсы разных типов вызовет панику. Давайте посмотрим на это:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s1 := []string{"a", "b", "c"}
  s2 := []int{1, 2, 3}

  val1 := reflect.ValueOf(s1)
  val2 := reflect.ValueOf(s2)

  res := reflect.AppendSlice(val1, val2)
  fmt.Println(res.Interface())
}

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

go"panic: reflect: AppendSlice of different types"

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

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