日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
面試扣分點(diǎn):什么是鴨子類型

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

平頂山網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,平頂山網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為平頂山近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的平頂山做網(wǎng)站的公司定做!

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

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

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

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

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

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

于是你刷刷刷寫下來一段 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: "旺財(cái)",} 
  39.     check(singleDog) 
  40.     check(dog) 

代碼運(yùn)行效果如下圖所示:

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

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

你說,是的。

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

你一時回答不上來。

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

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

面試官露出了耐克式的微笑,對你說:“回家等通知吧?!?/p>

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

怎么解釋什么叫做設(shè)計(jì)風(fēng)格呢?我們再用 Python 舉個例子:

  • 確保傳入的變量必須是特定類型,再執(zhí)行對應(yīng)的方法
 
 
 
 
  1. # 確保參數(shù)是特定類型再調(diào)用里面的方法 
  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("類型錯誤!") 
  • 不管傳入的參數(shù)是什么類型,只要它有 eat方法都能執(zhí)行。如果這個對象沒有eat方法,Python 自動就會拋出異常。
 
 
 
 
  1. def check(animal): 
  2.     animal.eat() 

在鴨子類型這種設(shè)計(jì)風(fēng)格中,開發(fā)者不關(guān)心對象是什么類型。它只關(guān)心對象有沒有特定的方法。

總結(jié):鴨子類型是一種設(shè)計(jì)風(fēng)格,不是一種具體的類型。

本文轉(zhuǎn)載自微信公眾號「未聞Code」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系未聞Code公眾號。


文章標(biāo)題:面試扣分點(diǎn):什么是鴨子類型
鏈接分享:http://www.5511xx.com/article/cdiopgh.html