Функция 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,
которая создает новый указатель на значение