Функция reflect.Indirect

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

Синтаксис

goreflect.Indirect(v reflect.Value) reflect.Value

Пример

Давайте создадим переменную типа int, получим ее указатель и с помощью функции reflect.Indirect получим значение:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 42
  v := reflect.ValueOf(&x)
  elem := reflect.Indirect(v)

  fmt.Println(elem.Interface())
  fmt.Println(elem.Kind())
}

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

go42
int

Пример

Если передать функции reflect.Indirect значение, которое не является указателем, она вернет его без изменений:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 42
  v := reflect.ValueOf(x)
  elem := reflect.Indirect(v)

  fmt.Println(elem.Interface())
  fmt.Println(elem.Kind())
}

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

go42
int

Пример

Функция reflect.Indirect полезна при работе с интерфейсами и указателями на структуры:

gopackage main

import (
  "fmt"
  "reflect"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  p := &Person{Name: "John", Age: 30}
  v := reflect.ValueOf(p)
  elem := reflect.Indirect(v)

  fmt.Println(elem.FieldByName("Name").Interface())
  fmt.Println(elem.FieldByName("Age").Interface())
}

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

go"John"
30

Пример

Функция reflect.Indirect также может быть использована для работы с указателями на указатели:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 42
  p1 := &x
  p2 := &p1

  v := reflect.ValueOf(p2)
  elem1 := reflect.Indirect(v)
  elem2 := reflect.Indirect(elem1)

  fmt.Println(elem1.Kind())
  fmt.Println(elem2.Interface())
}

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

goptr
42

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

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