Константа reflect.Invalid
Константа reflect.Invalid представляет собой значение типа reflect.Kind,
которое используется для обозначения отсутствия корректного типа или невалидного
значения. Она соответствует нулевому значению reflect.Kind и часто
возвращается функциями пакета reflect в случаях, когда операция
не может быть выполнена или значение не инициализировано.
Синтаксис
const Invalid = Kind(0)
Константа reflect.Invalid является константой типа reflect.Kind
с числовым значением 0. Она используется для проверки валидности
значений reflect.Value и reflect.Type, а также в качестве
индикатора ошибок при работе с рефлексией.
Использование с методом Kind
Метод Kind у reflect.Value возвращает константу reflect.Invalid,
если значение не инициализировано или является нулевым:
package 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)
}
Результат выполнения кода:
"Value is invalid"
"Kind: invalid"
Проверка валидности через IsValid
Метод IsValid у reflect.Value возвращает false,
если значение невалидно, что соответствует reflect.Invalid:
package 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())
}
}
Результат выполнения кода:
"Value is invalid"
"Kind: invalid"
Невалидное значение при распаковке интерфейса
При попытке получить значение из интерфейса, который не содержит
ничего, также возвращается reflect.Invalid:
package 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())
}
Результат выполнения кода:
"Interface contains no value"
"Kind of empty interface: invalid"
Пример проверки на валидность в функциях
Рассмотрим функцию, которая обрабатывает только валидные значения рефлексии и игнорирует невалидные:
package 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)
}
Результат выполнения кода:
"Cannot process invalid value"
"Processing value: abcde, kind: string"
Смотрите также
-
функцию
reflect.Kind,
которая представляет категорию типа значения -
метод
reflect.Value.IsValid,
который проверяет валидность значения -
функцию
reflect.ValueOf,
которая создает значение рефлексии из интерфейса -
функцию
reflect.TypeOf,
которая возвращает тип значения в рефлексии