Go语言IsNil()和IsValid()——判断反射值的空和有效性
方 法 | 说 明 | |
|---|---|---|
IsNil() bool | 返回值是否为 nil。如果值类型不是通道(channel)、函数、接口、map、指针或 切片时发生 panic,类似于语言层的v== nil操作 | |
IsValid() bool | 判断值是否有效。 当值本身非法时,返回 false,例如 reflect Value不包含任何值,值为 nil 等。 | |
下面的例子将会对各种方式的空指针进行 IsNil() 和 IsValid() 的返回值判定检测。同时对结构体成员及方法查找 map 键值对的返回值进行 IsValid() 判定,参考下面的代码。
反射值对象的零值和有效性判断:
package main
import (
"fmt"
"reflect"
)
func main() {
// *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())
}
代码输出如下:
var a *int: true
nil: false
(*int)(nil): false
不存在的结构体成员: false
不存在的结构体方法: false
不存在的键: false
代码说明如下:
第 11 行,声明一个 *int 类型的指针,初始值为 nil。
第 12 行,将变量 a 包装为 reflect.Value 并且判断是否为空,此时变量 a 为空指针,因此返回 true。
第 15 行,对 nil 进行 IsValid() 判定(有效性判定),返回 false。
第 18 行,(*int)(nil) 的含义是将 nil 转换为 *int,也就是*int 类型的空指针。此行将 nil 转换为 *int 类型,并取指针指向元素。由于 nil 不指向任何元素,*int 类型的 nil 也不能指向任何元素,值不是有效的。因此这个反射值使用 Isvalid() 判断时返回 false。
第 21 行,实例化一个结构体。
第 24 行,通过 FieldByName 查找 s 结构体中一个空字符串的成员,如成员不存在,IsValid() 返回 false。
第 27 行,通过 MethodByName 查找 s 结构体中一个空字符串的方法,如方法不存在,IsValid() 返回 false。
第 30 行,实例化一个 map,这种写法与 make 方式创建的 map 等效。
第 33 行,MapIndex() 方法能根据给定的 reflect.Value 类型的值查找 map,并且返回查找到的结果。
IsNil() 常被用于判断指针是否为空;IsValid() 常被用于判定返回值是否有效。
- 随机文章
- 中兴马尔代夫(中兴为马尔代夫提供5G服务)
- 移动 马尔代夫 信号(马尔代夫发出重要信号,旅行者请注意)
- 桐庐 马尔代夫 在哪里(桐庐马尔代夫位于何处?)
- 马尔代夫麦兜简介(马尔代夫麦兜介绍:畅享天堂岛国生活 → 马尔代夫麦兜:心心念念的岛国生活)
- 杭州 马尔代夫 机票查询(杭州-马尔代夫机票价格查询,预订特价机票就走你!)
- 澳洲-马尔代夫亲子游(亲子游:澳洲到马尔代夫,体验一场难忘的家庭之旅)
- 南亚马尔代夫山脉(探索南亚马尔代夫壮美山脉的神秘之美)
- 马尔代夫项目网址(马尔代夫项目官网:探索您的天堂之旅 -- 探索天堂之旅:马尔代夫项目官网)
- 中国复刻马尔代夫(复制马尔代夫,中国推出岛礁养护计划)
- 印度马尔代夫字体(印度与马尔代夫或将建立空气旅行走廊)
- 天堂 马尔代夫(重新探索:天堂之旅在马尔代夫)
- 巴西球员马尔代夫(巴西足球明星选择度假胜地:马尔代夫)
- 天涯马尔代夫旅游(探秘马尔代夫之旅,畅游天涯蓝色海洋)
- 望江马尔代夫图片(望江撒哈拉马尔代夫照片沙漠中的绿洲)
- 去马尔代夫买什么(马尔代夫必买清单:畅游海岛买什么?)
- 水下摄影马尔代夫(海底世界奇妙探秘:马尔代夫水下摄影)
- 民间秘密马尔代夫(探秘马尔代夫:解读岛国的神秘与魅力)
- 冬游马尔代夫沙滩(冬天的天堂,马尔代夫美丽沙滩等着你)
- 梦楠 马尔代夫(梦想成真!梦楠游览美丽的马尔代夫)
- 海南马尔代夫美景(探寻海南最美景色:仿若身临马尔代夫)
- 深圳马尔代夫美食(《探秘深圳一家马尔代夫餐厅的美食》)
- 散文马尔代夫游记(潜水、美食、浪漫,我的马尔代夫之旅)
- 李哲 马尔代夫(李哲探秘马尔代夫:海豚、沙滩和潜水!)
- 预定酒店马尔代夫(预订马尔代夫酒店,让你的假期更完美)
- 马尔代夫专业摄影(马尔代夫专业摄影:记录梦幻海底世界)
- 海上旅游马尔代夫(探索梦幻蓝海,畅游马尔代夫海上旅游)
- 途牛旅游马尔代夫(途牛旅游带你探索马尔代夫奢华之旅!)
- 马尔代夫免费攻略(马尔代夫旅行攻略:完美玩转免费景点)
- 茂名 马尔代夫(茂名游客走进马尔代夫,享受天堂般的度假体验)
- 马尔代夫分港口吗(马尔代夫港口重新分配,优化水运交通)
