C語言中文網 目錄
首頁 > Go語言教程 > Go語言反射 閱讀:3,631

Go語言IsNil()和IsValid()——判斷反射值的空和有效性

反射值對象(reflect.Value)提供一系列方法進行零值和空判定,如下表所示。

反射值對象的零值和有效性判斷方法
方 法 說 明
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() 常被用于判定返回值是否有效。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo