Функция reflect.New

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

Синтаксис

goreflect.New(typ)

Пример ⁅n="sect"⁆

Давайте создадим новый указатель на целое число и установим его значение:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var num int
  typ := reflect.TypeOf(num)
  ptr := reflect.New(typ)
  
  ptr.Elem().SetInt(42)
  res := ptr.Elem().Interface()
  fmt.Println(res)
}

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

go42

Пример ⁅n="sect"⁆

Давайте создадим новый указатель на строку и изменим ее значение:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  typ := reflect.TypeOf("")
  ptr := reflect.New(typ)
  
  ptr.Elem().SetString("Hello, World!")
  res := ptr.Elem().Interface()
  fmt.Println(res)
}

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

go"Hello, World!"

Пример ⁅n="sect"⁆

Давайте создадим указатель на структуру и заполним ее поля:

gopackage main

import (
  "fmt"
  "reflect"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  typ := reflect.TypeOf(Person{})
  ptr := reflect.New(typ)
  
  elem := ptr.Elem()
  elem.FieldByName("Name").SetString("Alice")
  elem.FieldByName("Age").SetInt(30)
  
  res := elem.Interface()
  fmt.Println(res)
}

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

go{Alice 30}

Пример ⁅n="sect"⁆

Давайте создадим указатель на срез и добавим в него элементы:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  typ := reflect.TypeOf([]int{})
  ptr := reflect.New(typ)
  
  elem := ptr.Elem()
  elem.Set(reflect.Append(elem, reflect.ValueOf(1)))
  elem.Set(reflect.Append(elem, reflect.ValueOf(2)))
  elem.Set(reflect.Append(elem, reflect.ValueOf(3)))
  
  res := elem.Interface()
  fmt.Println(res)
}

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

go[1 2 3]

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

  • функцию reflect.Zero,
    которая возвращает нулевое значение типа без создания указателя
  • функцию reflect.ValueOf,
    которая создает reflect.Value из обычного значения
  • функцию reflect.TypeOf,
    которая возвращает тип переданного значения
  • функцию reflect.Indirect,
    которая разыменовывает указатель, если это необходимо