十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章將為大家詳細(xì)講解有關(guān)Go語言與鴨子類型的關(guān)系是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
先直接來看維基百科里的定義:
If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.
翻譯過來就是:如果某個(gè)東西長得像鴨子,像鴨子一樣游泳,像鴨子一樣嘎嘎叫,那它就可以被看成是一只鴨子。
DuckTyping,鴨子類型,是動(dòng)態(tài)編程語言的一種對象推斷策略,它更關(guān)注對象能如何被使用,而不是對象的類型本身。Go語言作為一門靜態(tài)語言,它通過通過接口的方式完美支持鴨子類型。
當(dāng)調(diào)用此函數(shù)的時(shí)候,可以傳入任意類型,只要它實(shí)現(xiàn)了say_hello()函數(shù)就可以。如果沒有實(shí)現(xiàn),運(yùn)行過程中會(huì)出現(xiàn)錯(cuò)誤。
而在靜態(tài)語言如Java,C++中,必須要顯示地聲明實(shí)現(xiàn)了某個(gè)接口,之后,才能用在任何需要這個(gè)接口的地方。如果你在程序中調(diào)用hello_world函數(shù),卻傳入了一個(gè)根本就沒有實(shí)現(xiàn)say_hello()的類型,那在編譯階段就不會(huì)通過。這也是靜態(tài)語言比動(dòng)態(tài)語言更安全的原因。
動(dòng)態(tài)語言和靜態(tài)語言的差別在此就有所體現(xiàn)。靜態(tài)語言在編譯期間就能發(fā)現(xiàn)類型不匹配的錯(cuò)誤,不像動(dòng)態(tài)語言,必須要運(yùn)行到那一行代碼才會(huì)報(bào)錯(cuò)。插一句,這也是我不喜歡用python的一個(gè)原因。當(dāng)然,靜態(tài)語言要求程序員在編碼階段就要按照規(guī)定來編寫程序,為每個(gè)變量規(guī)定數(shù)據(jù)類型,這在某種程度上,加大了工作量,也加長了代碼量。動(dòng)態(tài)語言則沒有這些要求,可以讓人更專注在業(yè)務(wù)上,代碼也更短,寫起來更快,這一點(diǎn),寫python的同學(xué)比較清楚。
Go語言作為一門現(xiàn)代靜態(tài)語言,是有后發(fā)優(yōu)勢的。它引入了動(dòng)態(tài)語言的便利,同時(shí)又會(huì)進(jìn)行靜態(tài)語言的類型檢查,寫起來是非常Happy的。Go采用了折中的做法:不要求類型顯示地聲明實(shí)現(xiàn)了某個(gè)接口,只要實(shí)現(xiàn)了相關(guān)的方法即可,編譯器就能檢測到。
程序輸出:
在main函數(shù)中,調(diào)用調(diào)用sayHello()函數(shù)時(shí),傳入了golang,php對象,它們并沒有顯式地聲明實(shí)現(xiàn)了IGreeting類型,只是實(shí)現(xiàn)了接口所規(guī)定的sayHello()函數(shù)。實(shí)際上,編譯器在調(diào)用sayHello()函數(shù)時(shí),會(huì)隱式地將golang,php對象轉(zhuǎn)換成IGreeting類型,這也是靜態(tài)語言的類型檢查功能。
變量綁定的類型是不確定的,在運(yùn)行期間才能確定函數(shù)和方法可以接收任何類型的參數(shù),且調(diào)用時(shí)不檢查參數(shù)類型不需要實(shí)現(xiàn)接口
總結(jié)一下,鴨子類型是一種動(dòng)態(tài)語言的風(fēng)格,在這種風(fēng)格中,一個(gè)對象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由它"當(dāng)前方法和屬性的集合"決定。Go作為一種靜態(tài)語言,通過接口實(shí)現(xiàn)了鴨子類型,實(shí)際上是Go的編譯器在其中作了隱匿的轉(zhuǎn)換工作。
關(guān)于Go語言與鴨子類型的關(guān)系是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。