在 Golang 中,通过 反射 的 reflect.ValueOf()
获得反射的对象信息后,该反射对象提供了一系列方法来进行零值和空值的判定。
方 法 | 说 明 |
---|---|
IsNil() bool | 返回值是否为 nil。如果值类型不是通道(channel)、函数、接口、map、指针或 切片时发生 panic,类似于语言层的 v== nil 操作。 |
IsValid() bool | 判断值是否有效。 当值本身非法时,返回 false,例如 reflect Value不包含任何值,值为 nil 等。 |
通过反射可以判断是否为零值
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())
}
程序运行后,控制台输出如下:
我们首先定义了一个 int 类型的空指针 a,接着,使用 IsNil 判断该空指针,结果返回了 true ,因为,我们没有对该指针进行实例化,所以该指针默认的是空指针。
接着,我们直接对 nil 值使用 IsValid 进行判断,此时程序返回了 false,同时,我们对一个 int 类型的空指针进行判断,同样返回了 false。
最后,我们分别定义了一个空 结构体 和一个空 map,都使用 IsValid 进行判断,都返回了 false。
在 Golang 中,通过反射的 reflect.ValueOf()
获得反射的对象信息后,该反射对象提供了一系列方法来进行零值和空值的判定。