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

Go 面試題:Go interface 的一個 “坑” 及原理分析

開發 后端
前幾天在讀者交流群里看到一位小伙伴,針對 interface 的使用有了比較大的疑惑。Go interface 是 Go 語言中最常用的類型之一,大家用慣了 if err != nil 就很容易順手就踩進去了。

 [[387825]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚。轉載本文請聯系腦子進煎魚了公眾號。

大家好,我是煎魚。

前幾天在讀者交流群里看到一位小伙伴,針對 interface 的使用有了比較大的疑惑。

無獨有偶,我也在網上看到有小伙伴在 Go 面試的時候被問到了:

來自網上博客的截圖

今天特意分享出來讓大家避開這個坑。

例子一

第一個例子,如下代碼:

  1. func main() { 
  2.     var v interface{} 
  3.     v = (*int)(nil) 
  4.     fmt.Println(v == nil) 

你覺得輸出結果是什么呢?

答案是:

  1. false 

為什么不是 true。明明都已經強行置為 nil 了。是不是 Go 編譯器有問題?

例子二

第二個例子,如下代碼:

  1. func main() { 
  2.     var data *byte 
  3.     var in interface{} 
  4.  
  5.     fmt.Println(data, data == nil) 
  6.     fmt.Println(inin == nil) 
  7.  
  8.     in = data 
  9.     fmt.Println(inin == nil) 

你覺得輸出結果是什么呢?

答案是:

  1. <nil> true 
  2. <nil> true 
  3. <nil> false 

這可就更奇怪了,為什么剛剛聲明出來的 data 和 in 變量,確實是輸出結果是 nil,判斷結果也是 true。

怎么把變量 data 一賦予給變量 in,世界就變了?輸出結果依然是 nil,但判定卻變成了 false。

和上面的第一個例子結果類似,真是神奇。

原因

interface 判斷與想象中不一樣的根本原因是,interface 并不是一個指針類型,雖然他看起來很像,以至于誤導了不少人。

我們鉆下去 interface,interface 共有兩類數據結構:

  • runtime.eface 結構體:表示不包含任何方法的空接口,也稱為 empty interface。
  • runtime.iface 結構體:表示包含方法的接口。

看看這兩者相應的底層數據結構:

  1. type eface struct { 
  2.     _type *_type 
  3.     data  unsafe.Pointer 
  4.  
  5. type iface struct { 
  6.     tab  *itab 
  7.     data unsafe.Pointer 

你會發現 interface 不是單純的值,而是分為類型和值。

所以傳統認知的此 nil 并非彼 nil,必須得類型和值同時都為 nil 的情況下,interface 的 nil 判斷才會為 true。

解決辦法

與其說是解決方法,不如說是委婉的破局之道。在不改變類型的情況下,方法之一是利用反射(reflect),如下代碼:

  1. func main() { 
  2.     var data *byte 
  3.     var in interface{} 
  4.  
  5.     in = data 
  6.     fmt.Println(IsNil(in)) 
  7.  
  8. func IsNil(i interface{}) bool { 
  9.     vi := reflect.ValueOf(i) 
  10.     if vi.Kind() == reflect.Ptr { 
  11.         return vi.IsNil() 
  12.     } 
  13.     return false 

利用反射來做 nil 的值判斷,在反射中會有針對 interface 類型的特殊處理,最終輸出結果是:true,達到效果。

其他方法的話,就是改變原有的程序邏輯,例如:

  • 對值進行 nil 判斷,再返回給 interface 設置。
  • 返回具體的值類型,而不是返回 interface。

總結

Go interface 是 Go 語言中最常用的類型之一,大家用慣了 if err != nil 就很容易順手就踩進去了。

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2023-07-14 08:12:21

計時器unsafecontext

2023-06-20 08:25:53

NESTED源碼mybatis

2023-07-28 08:04:56

StringHeaatomic線程

2012-08-02 09:36:58

fork面試題

2015-10-12 15:50:07

PaaS云平臺開發go

2011-07-18 15:08:19

SQL存儲過程

2025-05-27 08:10:00

Go數組Map

2021-03-05 08:51:00

Go語言make

2024-08-14 13:24:24

2021-12-15 10:54:12

Gogofmt命令Go源代碼

2011-08-17 10:28:53

多對多查詢SQL Server

2009-06-06 18:34:05

java面試題

2021-07-04 08:01:30

Synchronize線程安全并發編程

2023-02-26 01:37:57

goORM代碼

2023-05-10 08:05:41

GoWeb應用

2025-05-26 08:15:00

Go開發指針

2022-06-15 08:14:40

Go線程遞歸

2014-10-15 11:01:02

Web應用測試應用

2014-12-02 10:02:30

2013-09-10 14:50:12

數組面試題
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产乱码一区二区三区a | 久久久久久久国产精品视频 | 成人免费网站 | 天天干天天谢 | 在线观看特色大片免费网站 | 亚洲成a | 欧洲一区在线观看 | 成人精品在线观看 | 国产黄色精品在线观看 | 免费观看一级特黄欧美大片 | 国产成人精品一区二区三区四区 | 国产精品美女久久久久aⅴ国产馆 | 波多野结衣中文视频 | 欧美成人精品一区二区男人看 | 国产精品99久久久久久www | 日本亚洲一区二区 | 激情久久久久 | 狠狠干天天干 | 黄免费在线 | 精品国产乱码久久久久久蜜退臀 | 成人福利网 | 久久精品二区亚洲w码 | 91中文视频 | 中文字幕高清免费日韩视频在线 | 九色 在线 | 欧美日韩一区精品 | 亚洲国产成人精品女人久久久野战 | 久久久久久久91 | 毛片免费在线 | 97国产一区二区精品久久呦 | 人和拘一级毛片c | 国产精品明星裸体写真集 | 久久精彩视频 | 日韩三级电影在线看 | 成年男女免费视频网站 | 九九色九九 | 国产精品国产三级国产aⅴ原创 | 一区二区成人 | 久久久久综合 | 国产精品自拍视频 | 美女视频黄色片 |