Go语言反射空值

Go语言反射空值教程

Golang 中,通过 反射reflect.ValueOf() 获得反射的对象信息后,该反射对象提供了一系列方法来进行零值和空值的判定。

Go语言反射空值判断方法

方 法 说 明
IsNil() bool 返回值是否为 nil。如果值类型不是通道(channel)、函数、接口、map、指针或 切片时发生 panic,类似于语言层的 v== nil 操作。
IsValid() bool 判断值是否有效。 当值本身非法时,返回 false,例如 reflect Value不包含任何值,值为 nil 等。

案例

Go语言反射零值判断

通过反射可以判断是否为零值

package main import ( "fmt" "reflect" ) func main() { fmt.Println("嗨客网(www.haicoder.net)") // *int的空指针 var a *int fmt.Println("var a *int:", reflect.ValueOf(a).IsNil()) // nil值 fmt.Println("nil:", reflect.ValueOf(nil).IsValid()) // *int类型的空指针 fmt.Println("(*int)(nil):", reflect.ValueOf((*int)(nil)).Elem().IsValid()) // 实例化一个结构体 s := struct{}{} // 尝试从结构体中查找一个不存在的字段 fmt.Println("不存在的结构体成员:", reflect.ValueOf(s).FieldByName("").IsValid()) // 尝试从结构体中查找一个不存在的方法 fmt.Println("不存在的结构体方法:", reflect.ValueOf(s).MethodByName("").IsValid()) // 实例化一个map m := map[int]int{} // 尝试从map中查找一个不存在的键 fmt.Println("不存在的键:", reflect.ValueOf(m).MapIndex(reflect.ValueOf(3)).IsValid()) }

程序运行后,控制台输出如下:

29_golang反射空值.png

我们首先定义了一个 int 类型的空指针 a,接着,使用 IsNil 判断该空指针,结果返回了 true ,因为,我们没有对该指针进行实例化,所以该指针默认的是空指针。

接着,我们直接对 nil 值使用 IsValid 进行判断,此时程序返回了 false,同时,我们对一个 int 类型的空指针进行判断,同样返回了 false。

最后,我们分别定义了一个空 结构体 和一个空 map,都使用 IsValid 进行判断,都返回了 false。

Go语言反射空值总结

在 Golang 中,通过反射的 reflect.ValueOf() 获得反射的对象信息后,该反射对象提供了一系列方法来进行零值和空值的判定。