Метод reflect.Value.Index

Метод reflect.Value.Index возвращает новое значение reflect.Value, представляющее элемент коллекции по указанному индексу. Метод принимает один параметр - индекс элемента типа int, и возвращает reflect.Value элемента. Он работает со слайсами, массивами и строками. Если значение не является слайсом, массивом или строкой, или индекс выходит за границы, возникает паника.

Синтаксис

govalue.Index(i int) reflect.Value

Пример

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  slice := []string{"a", "b", "c", "d", "e"}
  val := reflect.ValueOf(slice)

  elem := val.Index(1)
  fmt.Println(elem.Interface())
}

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

go"b"

Пример

Давайте получим третий элемент из массива целых чисел:

gopackage main

import (
  "fmt"
  "reflect"
)

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

  elem := val.Index(2)
  fmt.Println(elem.Interface())
}

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

go3

Пример

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  str := "abcde"
  val := reflect.ValueOf(str)

  elem := val.Index(0)
  fmt.Println(elem.Interface())
}

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

go97

Обратите внимание: для строк метод возвращает код символа типа uint8 (байт), а не символ как строку.

Пример

Давайте получим последний элемент слайса, используя метод Len для определения длины:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  slice := []int{10, 20, 30, 40, 50}
  val := reflect.ValueOf(slice)

  last := val.Index(val.Len() - 1)
  fmt.Println(last.Interface())
}

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

go50

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

  • метод reflect.Value.Len,
    который возвращает длину слайса, массива или строки
  • метод reflect.Value.Field,
    который возвращает поле структуры по индексу
  • метод reflect.Value.Elem,
    который возвращает значение, на которое указывает указатель
  • метод reflect.Value.Interface,
    который преобразует reflect.Value в обычный интерфейс