Функция reflect.Zero

Функция reflect.Zero принимает в качестве параметра тип reflect.Type и возвращает новое значение reflect.Value, представляющее нулевое значение для этого типа. Нулевое значение — это значение, которое присваивается переменной по умолчанию при ее объявлении без инициализации. Для разных типов данных нулевое значение имеет свои особенности: для чисел — это 0, для строк — пустая строка, для указателей — nil и так далее.

Синтаксис

goreflect.Zero(typ)

Пример

Давайте создадим нулевое значение для типа int:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var intType reflect.Type = reflect.TypeOf(0)
  val := reflect.Zero(intType)
  fmt.Printf("Type: %v, Value: %v, Kind: %v\n",
    val.Type(), val.Interface(), val.Kind())
}

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

go"Type: int, Value: 0, Kind: int"

Пример

Давайте создадим нулевое значение для типа string:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var strType reflect.Type = reflect.TypeOf("")
  val := reflect.Zero(strType)
  fmt.Printf("Type: %v, Value: %q, Kind: %v\n",
    val.Type(), val.Interface(), val.Kind())
}

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

go"Type: string, Value: "", Kind: string"

Пример

Давайте создадим нулевое значение для слайса:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  sliceType := reflect.TypeOf([]int{})
  val := reflect.Zero(sliceType)
  fmt.Printf("Type: %v, Value: %v, IsNil: %v\n",
    val.Type(), val.Interface(), val.IsNil())
}

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

go"Type: []int, Value: [], IsNil: true"

Пример

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  ptrType := reflect.TypeOf(new(int))
  val := reflect.Zero(ptrType)
  fmt.Printf("Type: %v, IsNil: %v, Value: %v\n",
    val.Type(), val.IsNil(), val.Interface())
}

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

go"Type: *int, IsNil: true, Value: <nil>"

Пример

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

gopackage main

import (
  "fmt"
  "reflect"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  structType := reflect.TypeOf(Person{})
  val := reflect.Zero(structType)
  fmt.Printf("Type: %v, Value: %+v\n",
    val.Type(), val.Interface())
}

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

go"Type: main.Person, Value: {Name: Age:0}"

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

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