Функция reflect.Indirect
Функция reflect.Indirect возвращает значение, хранящееся по указателю,
или само переданное значение, если оно не является указателем.
В первый параметр мы передаем значение типа reflect.Value,
которое может быть указателем, а функция возвращает значение,
на которое указывает этот указатель.
Если переданное значение не является указателем, функция возвращает его без изменений.
Синтаксис
reflect.Indirect(v reflect.Value) reflect.Value
Пример
Давайте создадим переменную типа int, получим ее указатель
и с помощью функции reflect.Indirect получим значение:
package main
import (
"fmt"
"reflect"
)
func main() {
x := 42
v := reflect.ValueOf(&x)
elem := reflect.Indirect(v)
fmt.Println(elem.Interface())
fmt.Println(elem.Kind())
}
Результат выполнения кода:
42
int
Пример
Если передать функции reflect.Indirect значение,
которое не является указателем, она вернет его без изменений:
package main
import (
"fmt"
"reflect"
)
func main() {
x := 42
v := reflect.ValueOf(x)
elem := reflect.Indirect(v)
fmt.Println(elem.Interface())
fmt.Println(elem.Kind())
}
Результат выполнения кода:
42
int
Пример
Функция reflect.Indirect полезна при работе с интерфейсами
и указателями на структуры:
package 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())
}
Результат выполнения кода:
"John"
30
Пример
Функция reflect.Indirect также может быть использована
для работы с указателями на указатели:
package 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())
}
Результат выполнения кода:
ptr
42
Смотрите также
-
функцию
reflect.ValueOf,
которая создает значение отражающей библиотеки -
функцию
reflect.Value.Elem,
которая возвращает значение, на которое указывает указатель -
функцию
reflect.Type.Elem,
которая возвращает тип элемента указателя -
функцию
reflect.New,
которая создает новый указатель на значение