Функция reflect.PtrTo
Функция reflect.PtrTo принимает один аргумент - значение типа reflect.Type и возвращает новый тип, представляющий указатель на данный тип. Возвращаемый тип будет иметь reflect.Kind равный reflect.Ptr. Этот метод часто используется совместно с reflect.New для создания указателей на значения известных типов во время выполнения программы.
Синтаксис
func PtrTo(t Type) Type
В функцию передается тип t, для которого нужно получить указатель. Возвращается тип указателя на t.
Пример
Давайте получим тип указателя на int и убедимся, что возвращаемый тип действительно является указателем:
package main
import (
"fmt"
"reflect"
)
func main() {
t := reflect.TypeOf(0)
ptrType := reflect.PtrTo(t)
fmt.Println(t.Kind())
fmt.Println(ptrType.Kind())
fmt.Println(ptrType)
}
Результат выполнения кода:
int
ptr
*int
Пример
Продемонстрируем использование reflect.PtrTo вместе с reflect.New для создания указателя на пользовательский тип структуры:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string
Age int
}
func main() {
userType := reflect.TypeOf(User{})
ptrType := reflect.PtrTo(userType)
ptrValue := reflect.New(userType)
fmt.Println(ptrType.Kind())
fmt.Println(ptrType.Elem().Kind())
fmt.Println(ptrValue.Type())
}
Результат выполнения кода:
ptr
struct
*main.User
Пример
При помощи reflect.PtrTo можно создавать указатели на срезы, карты и другие составные типы:
package main
import (
"fmt"
"reflect"
)
func main() {
sliceType := reflect.TypeOf([]int{})
mapType := reflect.TypeOf(map[string]int{})
slicePtrType := reflect.PtrTo(sliceType)
mapPtrType := reflect.PtrTo(mapType)
fmt.Println(slicePtrType.Elem().Kind())
fmt.Println(mapPtrType.Elem().Kind())
fmt.Println(slicePtrType)
fmt.Println(mapPtrType)
}
Результат выполнения кода:
slice
map
*[]int
*map[string]int
Смотрите также
-
функцию
reflect.TypeOf,
которая возвращает тип переданного значения -
функцию
reflect.New,
которая создает новое значение типа-указателя -
функцию
reflect.ValueOf,
которая возвращает значение интерфейса как значение отражающего типа -
функцию
reflect.Type.Elem,
которая возвращает базовый тип элемента для указателей, срезов, массивов и карт