Функция reflect.New
Функция reflect.New создает новый объект переданного типа и возвращает значение типа reflect.Value, которое представляет указатель на этот новый объект. В единственный параметр функция принимает объект типа reflect.Type, который определяет тип создаваемого объекта. Возвращаемое значение указывает на нулевое значение переданного типа, но в отличие от reflect.Zero, возвращает именно указатель, который можно использовать для изменения значения.
Синтаксис
reflect.New(typ)
Пример ⁅n="sect"⁆
Давайте создадим новый указатель на целое число и установим его значение:
package 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)
}
Результат выполнения кода:
42
Пример ⁅n="sect"⁆
Давайте создадим новый указатель на строку и изменим ее значение:
package 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)
}
Результат выполнения кода:
"Hello, World!"
Пример ⁅n="sect"⁆
Давайте создадим указатель на структуру и заполним ее поля:
package 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)
}
Результат выполнения кода:
{Alice 30}
Пример ⁅n="sect"⁆
Давайте создадим указатель на срез и добавим в него элементы:
package 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)
}
Результат выполнения кода:
[1 2 3]
Смотрите также
-
функцию
reflect.Zero,
которая возвращает нулевое значение типа без создания указателя -
функцию
reflect.ValueOf,
которая создает reflect.Value из обычного значения -
функцию
reflect.TypeOf,
которая возвращает тип переданного значения -
функцию
reflect.Indirect,
которая разыменовывает указатель, если это необходимо