您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Go語言與鴨子類型的關系是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
先直接來看維基百科里的定義:
If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.
翻譯過來就是:如果某個東西長得像鴨子,像鴨子一樣游泳,像鴨子一樣嘎嘎叫,那它就可以被看成是一只鴨子。
DuckTyping,鴨子類型,是動態編程語言的一種對象推斷策略,它更關注對象能如何被使用,而不是對象的類型本身。Go語言作為一門靜態語言,它通過通過接口的方式完美支持鴨子類型。
當調用此函數的時候,可以傳入任意類型,只要它實現了say_hello()函數就可以。如果沒有實現,運行過程中會出現錯誤。
而在靜態語言如Java,C++中,必須要顯示地聲明實現了某個接口,之后,才能用在任何需要這個接口的地方。如果你在程序中調用hello_world函數,卻傳入了一個根本就沒有實現say_hello()的類型,那在編譯階段就不會通過。這也是靜態語言比動態語言更安全的原因。
動態語言和靜態語言的差別在此就有所體現。靜態語言在編譯期間就能發現類型不匹配的錯誤,不像動態語言,必須要運行到那一行代碼才會報錯。插一句,這也是我不喜歡用python的一個原因。當然,靜態語言要求程序員在編碼階段就要按照規定來編寫程序,為每個變量規定數據類型,這在某種程度上,加大了工作量,也加長了代碼量。動態語言則沒有這些要求,可以讓人更專注在業務上,代碼也更短,寫起來更快,這一點,寫python的同學比較清楚。
Go語言作為一門現代靜態語言,是有后發優勢的。它引入了動態語言的便利,同時又會進行靜態語言的類型檢查,寫起來是非常Happy的。Go采用了折中的做法:不要求類型顯示地聲明實現了某個接口,只要實現了相關的方法即可,編譯器就能檢測到。
程序輸出:
在main函數中,調用調用sayHello()函數時,傳入了golang,php對象,它們并沒有顯式地聲明實現了IGreeting類型,只是實現了接口所規定的sayHello()函數。實際上,編譯器在調用sayHello()函數時,會隱式地將golang,php對象轉換成IGreeting類型,這也是靜態語言的類型檢查功能。
變量綁定的類型是不確定的,在運行期間才能確定函數和方法可以接收任何類型的參數,且調用時不檢查參數類型不需要實現接口
總結一下,鴨子類型是一種動態語言的風格,在這種風格中,一個對象有效的語義,不是由繼承自特定的類或實現特定的接口,而是由它"當前方法和屬性的集合"決定。Go作為一種靜態語言,通過接口實現了鴨子類型,實際上是Go的編譯器在其中作了隱匿的轉換工作。
關于Go語言與鴨子類型的關系是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。