Метод reflect.Value.IsZero

Метод reflect.Value.IsZero проверяет, является ли значение, хранящееся в reflect.Value, нулевым для своего типа. Он возвращает true, если значение соответствует нулевому значению своего типа (например, 0 для чисел, "" для строк, nil для указателей, срезов, карт, каналов и функций, а также пустые структуры и массивы, все элементы которых равны нулю). В противном случае возвращается false. Этот метод особенно полезен при работе с интерфейсами и динамической типизацией, когда необходимо определить, было ли значение явно установлено или осталось нулевым.

Синтаксис

gov.IsZero() bool

Метод не принимает параметров и возвращает логическое значение bool.

Пример с числовыми типами

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var zeroInt int = 0
  var nonZeroInt int = 42

  v1 := reflect.ValueOf(zeroInt)
  v2 := reflect.ValueOf(nonZeroInt)

  fmt.Println(v1.IsZero())
  fmt.Println(v2.IsZero())
}

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

gotrue
false

Пример со строковыми типами

Проверим нулевое состояние для строк:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var emptyStr string = ""
  var nonEmptyStr string = "hello"

  v1 := reflect.ValueOf(emptyStr)
  v2 := reflect.ValueOf(nonEmptyStr)

  fmt.Println(v1.IsZero())
  fmt.Println(v2.IsZero())
}

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

gotrue
false

Пример с указателями и интерфейсами

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var ptr *int = nil
  var slice []int = nil
  var iface interface{} = nil

  vPtr := reflect.ValueOf(ptr)
  vSlice := reflect.ValueOf(slice)
  vIface := reflect.ValueOf(iface)

  fmt.Println(vPtr.IsZero())
  fmt.Println(vSlice.IsZero())
  fmt.Println(vIface.IsZero())
}

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

gotrue
true
true

Пример со структурой и массивом

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

gopackage main

import (
  "fmt"
  "reflect"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  var emptyPerson Person
  var nonEmptyPerson = Person{Name: "Alice", Age: 30}
  var zeroArray [2]int

  v1 := reflect.ValueOf(emptyPerson)
  v2 := reflect.ValueOf(nonEmptyPerson)
  v3 := reflect.ValueOf(zeroArray)

  fmt.Println(v1.IsZero())
  fmt.Println(v2.IsZero())
  fmt.Println(v3.IsZero())
}

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

gotrue
false
true

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

  • метод reflect.Value.IsValid,
    который проверяет, содержит ли reflect.Value действительное значение
  • метод reflect.Value.IsNil,
    который проверяет, является ли значение указателем, каналом, функцией, интерфейсом, картой или срезом, равным nil
  • функцию reflect.Zero,
    которая возвращает нулевое значение для указанного типа
  • функцию reflect.DeepEqual,
    которая выполняет глубокое сравнение двух значений