Метод reflect.Value.IsNil

Метод reflect.Value.IsNil проверяет, является ли значение, хранящееся в reflect.Value, нулевым указателем. Он возвращает true, если значение равно nil, и false в противном случае. Метод работает только для типов, которые могут быть nil: указатели, каналы, функции, интерфейсы, карты и срезы. Для других типов вызов метода вызовет панику.

Синтаксис

goreflect.ValueOf(v).IsNil()

Пример

Давайте проверим, является ли нулевой указатель nil:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var p *int
  val := reflect.ValueOf(p)
  res := val.IsNil()
  fmt.Println(res)
}

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

gotrue

Пример

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  num := 42
  p := &num
  val := reflect.ValueOf(p)
  res := val.IsNil()
  fmt.Println(res)
}

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

gofalse

Пример

Давайте проверим, является ли нулевой срез nil:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var s []int
  val := reflect.ValueOf(s)
  res := val.IsNil()
  fmt.Println(res)
}

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

gotrue

Пример

Давайте проверим, является ли пустой срез nil:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s := []int{}
  val := reflect.ValueOf(s)
  res := val.IsNil()
  fmt.Println(res)
}

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

gofalse

Пример

Давайте проверим, является ли нулевая карта nil:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var m map[string]int
  val := reflect.ValueOf(m)
  res := val.IsNil()
  fmt.Println(res)
}

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

gotrue

Важное замечание

Метод IsNil вызывает панику, если вызвать его на значении типа, который не может быть nil. Например, на числе или строке. Перед вызовом IsNil рекомендуется проверять допустимость значения с помощью метода IsValid и проверять тип с помощью Kind.

gopackage 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")
    }
  }
}

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

go"Value cannot be nil"

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

  • метод reflect.Value.IsValid,
    который проверяет, содержит ли reflect.Value допустимое значение
  • метод reflect.Value.IsZero,
    который проверяет, является ли значение нулевым для своего типа
  • метод reflect.Value.Kind,
    который возвращает тип значения, хранящегося в reflect.Value
  • функцию reflect.ValueOf,
    которая создает reflect.Value из переданного значения