Метод reflect.Value.IsNil
Метод reflect.Value.IsNil проверяет, является ли значение, хранящееся в reflect.Value, нулевым указателем. Он возвращает true, если значение равно nil, и false в противном случае. Метод работает только для типов, которые могут быть nil: указатели, каналы, функции, интерфейсы, карты и срезы. Для других типов вызов метода вызовет панику.
Синтаксис
reflect.ValueOf(v).IsNil()
Пример
Давайте проверим, является ли нулевой указатель nil:
package main
import (
"fmt"
"reflect"
)
func main() {
var p *int
val := reflect.ValueOf(p)
res := val.IsNil()
fmt.Println(res)
}
Результат выполнения кода:
true
Пример
Давайте проверим, является ли инициализированный указатель nil:
package main
import (
"fmt"
"reflect"
)
func main() {
num := 42
p := &num
val := reflect.ValueOf(p)
res := val.IsNil()
fmt.Println(res)
}
Результат выполнения кода:
false
Пример
Давайте проверим, является ли нулевой срез nil:
package main
import (
"fmt"
"reflect"
)
func main() {
var s []int
val := reflect.ValueOf(s)
res := val.IsNil()
fmt.Println(res)
}
Результат выполнения кода:
true
Пример
Давайте проверим, является ли пустой срез nil:
package main
import (
"fmt"
"reflect"
)
func main() {
s := []int{}
val := reflect.ValueOf(s)
res := val.IsNil()
fmt.Println(res)
}
Результат выполнения кода:
false
Пример
Давайте проверим, является ли нулевая карта nil:
package main
import (
"fmt"
"reflect"
)
func main() {
var m map[string]int
val := reflect.ValueOf(m)
res := val.IsNil()
fmt.Println(res)
}
Результат выполнения кода:
true
Важное замечание
Метод IsNil вызывает панику, если вызвать его на значении типа, который не может быть nil. Например, на числе или строке. Перед вызовом IsNil рекомендуется проверять допустимость значения с помощью метода IsValid и проверять тип с помощью Kind.
package main
import (
"fmt"
"reflect"
)
func main() {
var num int
val := reflect.ValueOf(num)
// Проверяем, что значение допустимо и может быть nil
if val.IsValid() {
kind := val.Kind()
if kind == reflect.Ptr || kind == reflect.Slice ||
kind == reflect.Map || kind == reflect.Chan ||
kind == reflect.Func || kind == reflect.Interface {
res := val.IsNil()
fmt.Println(res)
} else {
fmt.Println("Value cannot be nil")
}
}
}
Результат выполнения кода:
"Value cannot be nil"
Смотрите также
-
метод
reflect.Value.IsValid,
который проверяет, содержит лиreflect.Valueдопустимое значение -
метод
reflect.Value.IsZero,
который проверяет, является ли значение нулевым для своего типа -
метод
reflect.Value.Kind,
который возвращает тип значения, хранящегося вreflect.Value -
функцию
reflect.ValueOf,
которая создаетreflect.Valueиз переданного значения