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

生產環境遇到一個 Go 問題,整組人都懵圈了...

開發 后端
為什么,這兩段 Go 程序是怎么回事...也太反直覺了?其背后的原因本質上還是對 Go 語言中 interface 的基本原理的理解。

[[394588]]

大家好,我是煎魚。

前段時間正在瘋狂寫代碼的時候,突然有一個讀者給我提了一個問題,讓我有了一定的興趣:

[[394589]]

我還是比較感興趣的,因為是生產環境、有代碼,且整組人都懵逼的問題。

在征求了小伙伴的意見后,今天分享出來,大家也思考一下原因,一起規避這個 “坑”。

案例一

代碼示例如下:

  1. type MyErr struct { 
  2.     Msg string 
  3.  
  4. func main() { 
  5.     var e error 
  6.     e = GetErr() 
  7.     log.Println(e == nil) 
  8.  
  9. func GetErr() *MyErr { 
  10.     return nil 
  11.  
  12. func (m *MyErr) Error() string { 
  13.     return "腦子進煎魚了" 

請思考一下,這段程序的輸出結果是什么?

該程序所調用的 GetErr 方法所返回的是 nil,而外部判斷是 e == nil,因此最終的輸出結果是 true,對嗎?

輸出結果如下:

  1. 2021/04/04 08:39:04 false 

答案是:false。

案例二

代碼示例如下:

  1. type Base interface { 
  2.     do() 
  3.  
  4. type App struct { 
  5.  
  6. func main() { 
  7.     var base Base 
  8.     base = GetApp() 
  9.      
  10.     log.Println(base) 
  11.     log.Println(base == nil) 
  12.  
  13. func GetApp() *App { 
  14.     return nil 
  15. func (a *App) do() {} 

請思考一下,這段程序的輸出結果是什么?

該程序調用了 GetApp 方法,該方法返回的是 nil,因此其賦值的 base 也是 nil。因此判斷 base == nil 的最終輸出結果是 和 true,對嗎?

輸出結果如下:

  1. 2021/04/04 08:59:00 <nil> 
  2. 2021/04/04 08:59:00 false 

答案是: 和 false。

為什么

為什么,這兩段 Go 程序是怎么回事...也太反直覺了?其背后的原因本質上還是對 Go 語言中 interface 的基本原理的理解。

在案例一中,雖然 GetErr 方法確實是返回了 nil,返回的類型也是具體的 *MyErr 類型。但是其接收的變量卻不是具體的結構類型,而是 error 類型:

  1. var e error 
  2. e = GetErr() 

在 Go 語言中, error 類型本質上是 interface:

  1. type error interface { 
  2.     Error() string 

因此兜兜轉轉又回到了 interface 類型的問題,interface 不是單純的值,而是分為類型和值。

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

在案例一中,結合代碼邏輯,更符合場景的是:

  1. var e *MyErr 
  2. e = GetErr() 
  3. log.Println(e == nil) 

輸出結果就會是 true。

在案例二中,也是一樣的結果,原因也是 interface。不管是 error 接口(interface),還是自定義的接口,背后原理一致,自然也就結果一致了。

總結

今天這篇文章,相當于是《Go 面試題:Go interface 的一個 “坑” 及原理分析》的變形了,畢竟是生產環境的代碼改造而來,更貼合真實的實際場景。

 

下意識的直覺有時候不是絕對正確的,我們要正確的理解 Go 語言中的那些知識點,才能更好地實現早下班的理想和愿景。

 

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

2022-05-31 08:35:05

RocketMQACK客戶端

2021-12-09 11:31:16

跨域后端開發

2023-11-15 14:34:05

MySQL悲觀鎖

2024-11-08 15:09:59

2024-11-11 14:57:56

JWTSession微服務

2020-12-23 09:04:56

開發雙引號數據

2021-07-14 15:06:50

SDK版本 jar

2025-02-13 07:49:18

2020-01-10 09:20:03

手機ISOJDK

2021-08-30 08:03:22

信號量Go

2020-04-02 09:31:49

微前端架構系統

2022-04-10 18:10:24

CURD鏈表

2022-09-27 08:19:20

前端React

2022-09-19 08:07:28

Goweb 程序

2022-11-28 08:37:23

MQ集群線程棧

2024-05-22 13:04:46

Python對象關系

2024-05-21 12:51:06

Python對象PyObject

2023-02-21 17:06:49

硬件軟件系統

2021-11-23 15:35:01

程序員Rust開發者

2019-05-23 09:30:22

網絡框架數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97在线超碰 | 一区二区三区免费 | 国产一级淫片免费视频 | 久久久久国产精品午夜一区 | 黄网站在线观看 | 欧美一区二区三区高清视频 | 久久9999久久| 日韩伦理一区二区 | 免费成人在线网 | 一级二级三级黄色 | 国产综合精品 | 国产精品久久久久久久久久久久久 | 亚洲第一色站 | 欧美一区二区三区四区视频 | 一级免费看 | 日韩久久综合 | 精品美女久久久 | 曰韩一二三区 | 99色播| 一区二区三区高清 | 亚洲日本欧美日韩高观看 | 精品香蕉一区二区三区 | 中文字幕在线欧美 | 狠狠干五月天 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 亚洲人免费视频 | 亚洲精品国产成人 | 一二三区av | 久久精品视频9 | 国产精品特级毛片一区二区三区 | 日韩在线观看一区二区三区 | 中文字幕综合 | 亚洲精品一区二区三区在线 | 超碰在线免费 | 久草视频在线播放 | caoporn免费 | 国产激情在线观看 | 亚洲少妇综合网 | 精品自拍视频 | 91久久精品一区二区二区 | 91电影 |