成人免费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

2024-08-14 13:24:24

2021-03-05 08:51:00

Go語言make

2021-12-15 10:54:12

Gogofmt命令Go源代碼

2011-08-17 10:28:53

多對多查詢SQL Server

2009-06-06 18:34:05

java面試題

2023-05-10 08:05:41

GoWeb應用

2023-02-26 01:37:57

goORM代碼

2021-07-04 08:01:30

Synchronize線程安全并發編程

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-11-01 09:27:48

Twitter技術面試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人伊人| 欧美a级成人淫片免费看 | 在线精品亚洲欧美日韩国产 | 欧美寡妇偷汉性猛交 | 免费日本视频 | 欧美一区二区三区视频 | 91九色porny首页最多播放 | 久久蜜桃资源一区二区老牛 | 精品久久亚洲 | www.47久久青青 | 欧美精品一区二区三区在线 | 免费亚洲成人 | 四虎永久 | 狠狠夜夜 | 成人深夜福利 | 成人午夜电影在线观看 | 欧美综合一区二区三区 | 久久久资源 | 欧美mv日韩mv国产网站91进入 | 亚洲精品播放 | 日日骚网| 欧美日韩国产一区二区三区 | 欧美黑人又粗大 | 国产精品无码专区在线观看 | 国产精品午夜电影 | 成人激情视频 | 日韩午夜影院 | 久久一区二区免费视频 | 亚洲超碰在线观看 | 午夜影院黄 | 日本免费一区二区三区 | 一区二区在线观看av | 精品国产欧美一区二区三区成人 | 国产激情自拍视频 | 成人综合伊人 | 天天爽夜夜操 | 久久手机视频 | 精品国产伦一区二区三区观看方式 | 色综合视频 | 天天综合久久 | av成人在线观看 |