Метод reflect.Value.IsZero
Метод reflect.Value.IsZero проверяет, является ли значение, хранящееся в reflect.Value, нулевым для своего типа. Он возвращает true, если значение соответствует нулевому значению своего типа (например, 0 для чисел, "" для строк, nil для указателей, срезов, карт, каналов и функций, а также пустые структуры и массивы, все элементы которых равны нулю). В противном случае возвращается false. Этот метод особенно полезен при работе с интерфейсами и динамической типизацией, когда необходимо определить, было ли значение явно установлено или осталось нулевым.
Синтаксис
v.IsZero() bool
Метод не принимает параметров и возвращает логическое значение bool.
Пример с числовыми типами
Давайте проверим нулевое состояние для целочисленных значений:
package 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())
}
Результат выполнения кода:
true
false
Пример со строковыми типами
Проверим нулевое состояние для строк:
package 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())
}
Результат выполнения кода:
true
false
Пример с указателями и интерфейсами
Для указателей, интерфейсов, срезов, карт и функций нулевым значением является nil:
package 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())
}
Результат выполнения кода:
true
true
true
Пример со структурой и массивом
Для структур и массивов нулевым считается значение, все поля которого находятся в нулевом состоянии:
package 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())
}
Результат выполнения кода:
true
false
true
Смотрите также
-
метод
reflect.Value.IsValid,
который проверяет, содержит лиreflect.Valueдействительное значение -
метод
reflect.Value.IsNil,
который проверяет, является ли значение указателем, каналом, функцией, интерфейсом, картой или срезом, равнымnil -
функцию
reflect.Zero,
которая возвращает нулевое значение для указанного типа -
функцию
reflect.DeepEqual,
которая выполняет глубокое сравнение двух значений