Функция reflect.Append

Функция reflect.Append добавляет значение к срезу и возвращает новый срез того же типа. Первый параметр функции — значение типа reflect.Value, представляющее срез. Второй параметр — значение, которое необходимо добавить, также типа reflect.Value. Если тип добавляемого значения не соответствует типу элементов среза, возникает паника. Функция возвращает новое значение reflect.Value, представляющее обновленный срез.

Синтаксис

goreflect.Append(slice, elem)

Пример

Давайте добавим строку в срез строк:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s := []string{"a", "b", "c"}
  sliceVal := reflect.ValueOf(s)
  elemVal := reflect.ValueOf("d")

  newSliceVal := reflect.Append(sliceVal, elemVal)
  res := newSliceVal.Interface().([]string)

  fmt.Println(res)
}

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

go[a b c d]

Пример

Теперь добавим число в срез целых чисел:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  nums := []int{1, 2, 3, 4}
  sliceVal := reflect.ValueOf(nums)
  elemVal := reflect.ValueOf(5)

  newSliceVal := reflect.Append(sliceVal, elemVal)
  res := newSliceVal.Interface().([]int)

  fmt.Println(res)
}

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

go[1 2 3 4 5]

Пример

Если попытаться добавить элемент неправильного типа, программа завершится паникой:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s := []string{"a", "b"}
  sliceVal := reflect.ValueOf(s)
  elemVal := reflect.ValueOf(42) // неправильный тип

  newSliceVal := reflect.Append(sliceVal, elemVal)
  res := newSliceVal.Interface().([]string)

  fmt.Println(res)
}

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

gopanic: reflect: call of reflect.Append on string Value

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

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