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

面試扣分點:什么是鴨子類型

開發 前端
有一類面試官特別討厭,面試的時候,會問一些偏、難、怪的題目。假設你今天去面試,遇到面試官問你:“什么是鴨子類型?”。你怎么回答?

[[408794]]

有一類面試官特別討厭,面試的時候,會問一些偏、難、怪的題目。假設你今天去面試,遇到面試官問你:“什么是鴨子類型?”。你怎么回答?

熟讀維基百科的你,腦海中閃過了下面這張截圖:

圖中的紅框像閃電一樣從你的腦子里劃過。你用中指扶了扶黑框眼鏡,自信地說道:

鴨子類型就是說,一個函數不會關心它傳入參數的類型,只關心這個參數對應的對象有沒有自己想要的方法和屬性。如果有,就能運行。如果沒有,就不能運行。這就像是我看到了一只鳥,只要它能像鴨子一樣叫,像鴨子一樣走路,有鴨子一樣的白色羽毛,那么,無論它實際上是什么東西,我都認為它是鴨子。

說完這段話,一道光從你的鏡片上一閃而過。你心里想,這下穩了。

面試官又問:那你用 Golang 寫一個鴨子類型的例子。

你一想,Golang 是靜態語言啊,參數都要聲明類型的,怎么繞過它的類型檢測呢?你又轉念再一想,不對,Golang 確實可以繞過類型檢測的。使用接口就可以了。

于是你刷刷刷寫下來一段 Golang 語言的代碼:

  1. package main 
  2.  
  3.  
  4. import ( 
  5.     "fmt" 
  6.  
  7.  
  8. type Animal interface { 
  9.     Sleep() 
  10.     Eat(food string) 
  11.  
  12.  
  13. type People struct { 
  14.     name string 
  15.  
  16. type Pet struct { 
  17.     name string 
  18.  
  19. func (p People) Sleep(){ 
  20.     fmt.Println(p.name"在睡覺"
  21.  
  22. func (p Pet) Sleep() { 
  23.     fmt.Println(p.name"在睡覺"
  24.  
  25. func (p People) Eat(food string) { 
  26.     fmt.Printf("%s在吃%s\n", p.name, food) 
  27.  
  28. func (p Pet) Eat(food string) { 
  29.     fmt.Printf("%s在吃%s\n", p.name, food) 
  30.  
  31. func check(animal Animal) { 
  32.     animal.Eat("狗狼"
  33.     animal.Sleep() 
  34.  
  35.  
  36. func main(){ 
  37.     singleDog := People{name"單身狗",} 
  38.     dog := Pet{name"旺財",} 
  39.     check(singleDog) 
  40.     check(dog) 

代碼運行效果如下圖所示:

然后你解釋道,在函數main()里面,變量singleDog的類型是 People 類型,變量dog的類型是Pet類型。雖然他們是不同的類型,但是由于他們都有Eat方法和Sleep方法,所以,他們都能在check函數里面運行。

面試官又問,你的代碼寫得沒有問題,例子也舉得沒有問題。那我再問你,既然check函數不關心傳入參數的類型,只關心他們的方法,是不是說明check函數接收的參數是鴨子類型?

你說,是的。

面試官又問,但是,我們從代碼里面可以看到,check函數接收的這個參數animal的類型是接口類型。那是不是說明接口類型等于鴨子類型?

你一時回答不上來。

面試官又問:那接口類型和鴨子類型是什么關系?鴨子類型是像int、string、map這樣內置的類型嗎?我們可以在 Golang 里面使用var a string 聲明一個類型為string的變量,那請問怎么聲明一個類型為鴨子的變量?

你一時想不起來 Golang 自帶的關鍵詞里面,哪個關鍵詞包含duck這個單詞。

面試官露出了耐克式的微笑,對你說:“回家等通知吧。”

這個討厭的面試官最后一個問題把你難住了。但是這個問題其實是一個陷阱。面試官給你玩了一個文字游戲。當他把鴨子類型和整型、字符串類型合在一起說的時候,讓你覺得鴨子類型也是一種類型。但實際上鴨子類型并不是一種類型,鴨子類型是一種動態類型的風格:

怎么解釋什么叫做設計風格呢?我們再用 Python 舉個例子:

  • 確保傳入的變量必須是特定類型,再執行對應的方法
  1. # 確保參數是特定類型再調用里面的方法 
  2. def check(animal): 
  3.     if isinstance(animal, Pet): 
  4.         animal.eat() 
  5.     elif isinstance(animal, People): 
  6.         animal.eat() 
  7.     else
  8.         raise Exception("類型錯誤!"
  • 不管傳入的參數是什么類型,只要它有 eat方法都能執行。如果這個對象沒有eat方法,Python 自動就會拋出異常。
  1. def check(animal): 
  2.     animal.eat() 

在鴨子類型這種設計風格中,開發者不關心對象是什么類型。它只關心對象有沒有特定的方法。

總結:鴨子類型是一種設計風格,不是一種具體的類型。

本文轉載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉載本文請聯系未聞Code公眾號。

 

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2017-09-13 00:07:05

Python編程語言動態語言

2022-04-11 07:51:53

鴨子類型猴子補丁Python

2021-08-24 08:05:41

泛型類型擦除Class

2021-09-07 10:44:33

Java 注解開發

2023-12-06 09:10:28

JWT微服務

2022-05-30 07:34:33

三范式Java

2024-02-22 15:36:23

Java內存模型線程

2021-12-08 06:53:29

面試動態代理

2021-03-12 13:57:13

零拷貝技術

2022-09-29 07:30:57

數據庫索引字段

2023-02-03 07:24:49

雙親委派模型

2024-03-04 07:37:40

MySQL記錄鎖

2022-01-24 07:01:20

安全多線程版本

2021-05-25 09:00:52

責任鏈模式設計模式面試經歷

2024-03-06 08:00:56

javaAQS原生

2021-02-19 10:02:57

HTTPSJava安全

2022-08-31 07:04:50

Bean作用域

2023-12-20 14:35:37

Java虛擬線程

2022-03-02 07:36:37

池化技術Java線程池

2022-01-04 06:56:43

面試Java方法重載
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品污www一区二区三区 | 国产精品久久av | 色综合视频| 中文一级片 | 这里有精品 | 欧美一区在线视频 | 在线观看av网站永久 | 亚洲国产精品久久久久 | 中文字幕电影在线观看 | 国产三级网站 | 欧美成人免费电影 | 罗宾被扒开腿做同人网站 | 亚洲人人 | 日韩欧美中文字幕在线视频 | 成人超碰| 国产99久久久国产精品下药 | 免费黄色的网站 | 精品一区二区三区四区五区 | www.日韩系列| 日韩精品在线一区 | 老司机67194精品线观看 | 巨大荫蒂视频欧美另类大 | 国产成人精品一区二三区在线观看 | 国产 日韩 欧美 中文 在线播放 | 91中文 | 久久久激情视频 | 一区二区免费视频 | 国产精品美女久久久久aⅴ国产馆 | 黄色毛片在线看 | 天天操 夜夜操 | 免费激情av | 欧美精品在线一区 | 国产大片黄色 | 99热热 | 亚洲一在线 | 久久久久国产精品www | 日韩一区二区av | 国产精品美女视频 | 午夜精品久久久久99蜜 | 污视频在线免费观看 | 成人蜜桃av |