成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們優雅判斷 interface 是否為 nil

開發 前端
我們先后使用了 int、*int、slice、map、interface{}、自定義結構體? 來測試此 IsNil 方法。

背景

很久之前發過一篇文章:《10個令人驚嘆的Go語言技巧,讓你的代碼更加優雅》,這篇文章中第八點有一處錯誤的地方被認真的讀者發現了:

圖片圖片

于是我有空之后,立馬重新看了那篇文章的內容,確實是存在讀者所說的問題。

問題

問題就在于下面這句話,文章也是有列出的:

即使接口持有的值為 nil,也不意味著接口本身為 nil。

但是在執行以下語句的時候,是有可能報 panic 的:

return reflect.ValueOf(x).IsNil()

而輸出也是非常明顯的指出錯誤:

panic: reflect: call of reflect.Value.IsNil on int Value

因為不可 nil 的 interface 是不能使用 reflect.Value.IsNil 方法。

那么問題就很好解決了。

解決方式

我們在執行 reflect.Value.IsNil 方法之前,進行一次判斷是否為指針即可:

func IsNil(x interface{}) bool {
 if x == nil {
  return true
 }
 rv := reflect.ValueOf(x)
 return rv.Kind() == reflect.Ptr && rv.IsNil()
}

重點在于 rv.Kind() == reflect.Ptr && rv.IsNil() 這段代碼。

這段代碼的作用:

  • 判斷 x 的類型是否為指針。
  • 判斷 x 的值是否真的為 nil。

下面我們使用幾種常見的數據類型來進行測試:

func IsNil(x interface{}) bool {
 if x == nil {
  return true
 }
 rv := reflect.ValueOf(x)
 return rv.Kind() == reflect.Ptr && rv.IsNil()
}

func main() {
 fmt.Printf("int IsNil: %t\n", IsNil(returnInt()))
 fmt.Printf("intPtr IsNil: %t\n", IsNil(returnIntPtr()))
 fmt.Printf("slice IsNil: %t\n", IsNil(returnSlice()))
 fmt.Printf("map IsNil: %t\n", IsNil(returnMap()))
 fmt.Printf("interface IsNil: %t\n", IsNil(returnInterface()))
 fmt.Printf("structPtr IsNil: %t\n", IsNil(returnStructPtr()))
}

func returnInt() interface{} {
 var value int
 return value
}

func returnIntPtr() interface{} {
 var value *int
 return value
}

func returnSlice() interface{} {
 var value []string
 return value
}

func returnMap() interface{} {
 var value map[string]struct{}
 return value
}

func returnInterface() interface{} {
 var value interface{}
 return value
}

type People struct {
 Name string
}

func returnStructPtr() interface{} {
 var value *People
 return value
}

我們先后使用了 int、*int、slice、map、interface{}、自定義結構體 來測試此 IsNil 方法。運行程序輸出為:

int IsNil: false
intPtr IsNil: true
slice IsNil: false
map IsNil: false
interface IsNil: true
structPtr IsNil: true

從測試結果來看,目前是符合我們對此方法的定位的。

責任編輯:武曉燕 來源: 愛發白日夢的后端
相關推薦

2016-05-24 10:30:56

網站設計出色

2020-11-12 06:03:54

IP IPv4IPv6

2024-06-12 09:52:00

2020-10-22 08:06:05

JavaScrip語言類型

2020-10-22 14:00:31

JavaScript數字變量

2021-12-27 08:53:23

Go函數 Nil

2022-01-03 20:13:08

Gointerface 面試

2017-02-08 11:30:51

PHP判斷數組

2009-12-16 14:51:26

Ruby nil

2015-03-13 09:36:09

NULLnullptr

2010-06-01 15:20:11

MySQL表單

2022-08-25 14:48:11

變量前端

2009-12-01 10:00:51

PHP判斷字符串是否為

2021-12-02 07:25:58

ASP.NET CorAjax請求

2015-05-28 09:52:21

PHP判斷數組為空

2023-11-30 07:40:05

URLCMS

2021-01-04 09:12:31

集合變量

2023-02-21 15:19:25

JavaScriptypeof數據類型

2013-10-11 10:06:48

Ubuntu開源

2018-11-11 23:03:25

物聯網IoT互聯網
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91久久国产精品 | 狠狠干2020 | 久久久国产一区二区 | 特级特黄特色的免费大片 | 91视视频在线观看入口直接观看 | 美女爽到呻吟久久久久 | 亚洲网站在线 | 激情五月婷婷在线 | 欧美日韩高清 | 日本理论片好看理论片 | 精品国产乱码久久久久久果冻传媒 | 久久99精品国产 | 国产农村妇女精品一二区 | 成人精品一区二区三区中文字幕 | 国产福利久久 | 久久久国产一区二区三区 | 日韩精品一区二区三区在线观看 | 久久久久久亚洲精品 | 国产亚洲一区二区三区在线观看 | 久久精品视频在线观看 | 日韩视频免费在线 | 欧美综合在线观看 | 久久精品国产一区二区三区不卡 | 成人av播放 | 欧美激情综合 | 美国黄色毛片 | 精品一区二区三区在线观看 | 国产伦精品一区二区三区精品视频 | www.887色视频免费 | 美女爽到呻吟久久久久 | 国产精品美女久久久久aⅴ国产馆 | 久草电影网 | 色频 | 狠狠色网 | 日韩午夜精品 | 婷婷国产一区 | 国产农村妇女毛片精品久久麻豆 | 欧美精品99| 欧美日韩成人 | 国产在线一区二区 | 少妇久久久久 |