Функция reflect.PtrTo

Функция reflect.PtrTo принимает один аргумент - значение типа reflect.Type и возвращает новый тип, представляющий указатель на данный тип. Возвращаемый тип будет иметь reflect.Kind равный reflect.Ptr. Этот метод часто используется совместно с reflect.New для создания указателей на значения известных типов во время выполнения программы.

Синтаксис

gofunc PtrTo(t Type) Type

В функцию передается тип t, для которого нужно получить указатель. Возвращается тип указателя на t.

Пример

Давайте получим тип указателя на int и убедимся, что возвращаемый тип действительно является указателем:

gopackage 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)
}

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

goint
ptr
*int

Пример

Продемонстрируем использование reflect.PtrTo вместе с reflect.New для создания указателя на пользовательский тип структуры:

gopackage 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())
}

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

goptr
struct
*main.User

Пример

При помощи reflect.PtrTo можно создавать указатели на срезы, карты и другие составные типы:

gopackage 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)
}

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

goslice
map
*[]int
*map[string]int

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

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