Константа reflect.Invalid

Константа reflect.Invalid представляет собой значение типа reflect.Kind, которое используется для обозначения отсутствия корректного типа или невалидного значения. Она соответствует нулевому значению reflect.Kind и часто возвращается функциями пакета reflect в случаях, когда операция не может быть выполнена или значение не инициализировано.

Синтаксис

goconst Invalid = Kind(0)

Константа reflect.Invalid является константой типа reflect.Kind с числовым значением 0. Она используется для проверки валидности значений reflect.Value и reflect.Type, а также в качестве индикатора ошибок при работе с рефлексией.

Использование с методом Kind

Метод Kind у reflect.Value возвращает константу reflect.Invalid, если значение не инициализировано или является нулевым:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var v reflect.Value
  kind := v.Kind()
  if kind == reflect.Invalid {
    fmt.Println("Value is invalid")
  }
  fmt.Printf("Kind: %v\n", kind)
}

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

go"Value is invalid"
"Kind: invalid"

Проверка валидности через IsValid

Метод IsValid у reflect.Value возвращает false, если значение невалидно, что соответствует reflect.Invalid:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var v reflect.Value
  if !v.IsValid() {
    fmt.Println("Value is invalid")
    fmt.Printf("Kind: %v\n", v.Kind())
  }
}

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

go"Value is invalid"
"Kind: invalid"

Невалидное значение при распаковке интерфейса

При попытке получить значение из интерфейса, который не содержит ничего, также возвращается reflect.Invalid:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var i interface{}
  v := reflect.ValueOf(i)
  if v.Kind() == reflect.Invalid {
    fmt.Println("Interface contains no value")
  }
  fmt.Printf("Kind of empty interface: %v\n", v.Kind())
}

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

go"Interface contains no value"
"Kind of empty interface: invalid"

Пример проверки на валидность в функциях

Рассмотрим функцию, которая обрабатывает только валидные значения рефлексии и игнорирует невалидные:

gopackage main

import (
  "fmt"
  "reflect"
)

func processValue(v reflect.Value) {
  if v.Kind() == reflect.Invalid {
    fmt.Println("Cannot process invalid value")
    return
  }
  fmt.Printf("Processing value: %v, kind: %v\n", v, v.Kind())
}

func main() {
  var v reflect.Value
  processValue(v)

  valid := reflect.ValueOf("abcde")
  processValue(valid)
}

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

go"Cannot process invalid value"
"Processing value: abcde, kind: string"

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

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