go nil转为interface{}后判断不可靠

判断一个值是否为nil,最好是直接跟nil进行比较判断,而不要通过interface{}的形参传给另一个函数来进行判断。
但是用反射可以通过interface{}来判断nil,如testnil5。
看如下示例代码,a是一空指针,但只有testnil4和testnil5能正确判断出来:

type State struct {}

func testnil1(a, b interface {}) bool {
      return a == b
}

func testnil2(a *State, b interface{}) bool{
      return a == b
}

func testnil3(a interface {}) bool {
      return a == nil
}

func testnil4(a *State) bool {
      return a == nil
}

func testnil5(a interface {}) bool {
      v := reflect.ValueOf(a)
      return !v.IsValid() || v.IsNil()
}

func main(){
      var a *State
      fmt.Println(a)

      fmt.Println(testnil1(a, nil))
      fmt.Println(testnil2(a, nil))
      fmt.Println(testnil3(a))
      fmt.Println(testnil4(a))
      fmt.Println(testnil5(a))
}

输出结果为:

<nil>
false
false
false
true
true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值