所謂Go語言式的接口,就是不用顯示聲明類型T實(shí)現(xiàn)了接口I,只要類型T的公開方法完全滿足接口I的要求,就可以把類型T的對象用在需要接口I的地方。這種做法的學(xué)名叫做Structural Typing,有人也把它看作是一種靜態(tài)的Duck Typing。除了Go的接口以外,類似的東西也有比如Scala里的Traits等等。有人覺得這個特性很好,但我個人并不喜歡這種做法,所以在這里談?wù)勊娜秉c(diǎn)。當(dāng)然這跟動態(tài)語言靜態(tài)語言的討論類似,不能簡單粗暴的下一個“好”或“不好”的結(jié)論。
成都創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站制作、做網(wǎng)站與策劃設(shè)計(jì),長陽網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:長陽等地區(qū)。長陽做網(wǎng)站價格咨詢:13518219792
我的觀點(diǎn):
Go的隱式接口Duck Typing確實(shí)不是新技術(shù), 但是在主流靜態(tài)編程語言中支持Duck Typing應(yīng)該是很少的(不清楚目前是否只有Go語言支持).
靜態(tài)類型和動態(tài)類型雖然沒有絕對的好和不好, 但是每個都是有自己的優(yōu)勢的, 沒有哪一個可以包辦一切. 而Go是試圖結(jié)合靜態(tài)類型和動態(tài)類型(interface)各自的優(yōu)勢.
那么就從頭談起:什么是接口。其實(shí)通俗的講,接口就是一個協(xié)議,規(guī)定了一組成員,例如.NET里的ICollection接口:
public interface ICollection {
int Count { get; }
object SyncRoot { get; }
bool IsSynchronized { get; }
void CopyTo(Array array, int index);
}
這就是一個協(xié)議的全部了嗎?事實(shí)并非如此,其實(shí)接口還規(guī)定了每個行為的“特征”。打個比方,這個接口的Count除了需要返回集合內(nèi)元素的數(shù)目以外,還隱含了它需要在O(1)時間內(nèi)返回這個要求。這樣一個使用了ICollection接口的方法才能放心地使用Count屬性來獲取集合大小,才能在知道這些特征的情況下選用正確的算法來編寫程序,而不用擔(dān)心帶來性能問題,這才能實(shí)現(xiàn)所謂的“面向接口編程”。當(dāng)然這種“特征”并不但指“性能”上的,例如Count還包含了例如“不修改集合內(nèi)容”這種看似十分自然的隱藏要求,這都是ICollection協(xié)議的一部分。
C++適合本地程序的開發(fā)。Go語言適合網(wǎng)絡(luò)程序和本地程序的開發(fā)。Go的優(yōu)點(diǎn):垃圾回收,語意明確,格式統(tǒng)一。?Go的缺點(diǎn):效率目前沒有C++高,但對于桌面程序而言,效率問題不大,因?yàn)橛布呀?jīng)很快了。c++過于復(fù)雜了,加入很多炫技的內(nèi)容。這些內(nèi)容脫離了事情的本質(zhì)。
最明顯的就是所謂的面向?qū)ο?。基于面向?qū)ο蟮墓こ倘绻銐虼蟮那闆r下,會帶來很大的耦合度,如果再加上內(nèi)存管理,多線程等等。項(xiàng)目后期基本上沒辦法維護(hù)和增加功能。
關(guān)于c++的語言復(fù)雜性,你可以問知乎上的任何一位高手。沒一個敢說自己精通c++。你也可以去看一下所有的c++編繹器,沒有任何一個敢說自己完全實(shí)現(xiàn)了c++的標(biāo)準(zhǔn)。不同的編繹器之間實(shí)現(xiàn)細(xì)節(jié)又不同。所以功能再強(qiáng)大沒有實(shí)用性,就失去了意義,只會制造更多的問題。
golang在近些年被追捧,不管某華,某阿在很多服務(wù)器開發(fā)上都在使用。
你不用懷疑golang的
優(yōu)勢:部署簡單,良好的語言設(shè)計(jì),并發(fā)性好,性能優(yōu)良,開發(fā)簡潔快,標(biāo)準(zhǔn)庫強(qiáng)大,編譯簡單
缺點(diǎn):還存在一些缺陷(例如垃圾回收),缺少安全檢查,性能方面目前比不過java,第三方庫不及java
但作為新興語種,我們不用擔(dān)心,背后有谷歌支持和java持平也就是時間上的問題。
而且前面還有某華,某阿頂著不怕。
Go語言自亮相以來并沒有展示一個明確的方向,Google員工將Go語言稱為一個“試驗(yàn)性語言”,稱其試圖融合Python等動態(tài)語言的開發(fā)速度和C或C++等編譯語言的性能和安全。一位Go語言的支持者概括而言Go語言如下:簡單、快速、安全、并發(fā)、快樂編程、開源;但Go語言缺乏方向以及其“集大成者”的嘗試很容易會導(dǎo)致其學(xué)貓不成學(xué)狗也不成,淪為四不像。盡管如此,編者仍然覺得Go語言有相當(dāng)大的潛力:很多開發(fā)者對它感興趣——不僅它的最初設(shè)計(jì)者陣容強(qiáng)大,而且在參與修改源代碼的人群中也不乏大牛級人物。這很有可能幫助Go語言找到適合自己的方向,開拓系統(tǒng)編程的新方向。
我并沒有什么編程的經(jīng)驗(yàn),覺得編程實(shí)在是太復(fù)雜了,不喜歡去研究太多,對這個也不怎么懂,只能說自己是個半吊子,就是所掌握的知識,也是東拼西湊的,朋友和我說點(diǎn)兒,自己去書上看一點(diǎn)兒,只能說根據(jù)自己的體驗(yàn)給出一些體會吧。
Rust的優(yōu)勢是:
1、Rust把安全、精確的內(nèi)存管理作為一切的中心放在首要的位置。
2、Rust同時擁有特別強(qiáng)的控制性和特別強(qiáng)的安全性。
3、Rust語言通過: 優(yōu)秀的類型系統(tǒng)設(shè)計(jì)、 嚴(yán)格的編譯器靜態(tài)審查、 配合程序員局部核對、加上少量的運(yùn)行時校驗(yàn),保障了內(nèi)存安全。
4、Rust的語言特別的復(fù)雜,導(dǎo)致學(xué)習(xí)曲線比較陡峭,對于初學(xué)者來說難度較大。但學(xué)通之后將終生受益。
5、效率高,速度特別的快
6、 支持范型
7、 社區(qū)活躍度很高,更加的強(qiáng)調(diào)了社區(qū)的作用。
8、Rust 有更強(qiáng)的語義,更容易捕獲錯誤的邏輯,編譯器直接檢查出你代碼中的不安全的部分
Rust的劣勢是:
1、 語言相對來說比較復(fù)雜,對于新手來說,讓新手摸不著頭腦。
2、還不算太穩(wěn)定。
其實(shí)我覺得什么代碼啊編程啊這些東西還是比較適合理工的學(xué)生去研究,我一看腦袋就大,完全不明白在講什么。我大概了解的就是這些,語言的話大家可以多方面的去了解,也不是說有缺點(diǎn)就是不好,看配置看個人吧,每個人習(xí)慣不一樣,也許有的人用不穩(wěn)定的還覺得挺好呢,有的人就喜歡比較完美的,在我看來編程這個東西真的是很復(fù)雜,會有很多的代碼,這些代碼弄得我自己頭都大了,有的時候還得去惡補(bǔ)一下。
區(qū)塊鏈2.0就是把人類的統(tǒng)一語言、經(jīng)濟(jì)行為、社會制度乃至生命都寫就為一個基礎(chǔ)軟件協(xié)議。統(tǒng)一語將人類各民族自然語言統(tǒng)一為一種低熵值的表達(dá)形式并提供了它與計(jì)算機(jī)語言的接口;人類經(jīng)濟(jì)行為、社會制度體系和生命再生機(jī)制統(tǒng)稱為時間貨幣系統(tǒng)。區(qū)塊鏈2.0既是集成了統(tǒng)一語和時間貨幣的分布式人工智能操作系統(tǒng)。
從語言本身特點(diǎn)來看,Go 是一種非常高效的語言,高度支持并發(fā)性,Go 語言的本身,它更注重的是分布式系統(tǒng),并發(fā)處理相對還是不錯的,比如廣告和搜索,那種高并發(fā)的服務(wù)器。
Go語言優(yōu)點(diǎn):
性能優(yōu)秀,可直接編譯成機(jī)器碼,不依賴其他庫,Go 極其地快。其性能與 Java 或 C++相似。
語言層面支持并發(fā),這個就是Go最大的特色,天生的支持并發(fā),Go就是基因里面支持的并發(fā),可以充分的利用多核,很容易的使用并發(fā)。
內(nèi)置runtime,支持垃圾回收,這屬于動態(tài)語言的特性之一吧,雖然目前來說GC不算完美,但是足以應(yīng)付我們所能遇到的大多數(shù)情況,特別是Go1.1之后的GC。
簡單易學(xué),Go語言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go關(guān)鍵字是25個,但是表達(dá)能力很強(qiáng)大,幾乎支持大多數(shù)你在其他語言見過的特性:繼承、重載、對象等。
豐富的標(biāo)準(zhǔn)庫,Go目前已經(jīng)內(nèi)置了大量的庫,特別是網(wǎng)絡(luò)庫非常強(qiáng)大,我最愛的也是這部分。
內(nèi)置強(qiáng)大的工具,Go語言里面內(nèi)置了很多工具鏈,最好的應(yīng)該是gofmt工具,自動化格式化代碼,能夠讓團(tuán)隊(duì)review變得如此的簡單,代碼格式一模一樣,想不一樣都很困難。
跨平臺編譯,快速編譯,相較于 Java 和 C++呆滯的編譯速度,Go 的快速編譯時間是一個主要的效率優(yōu)勢
Go語言缺點(diǎn):
軟件包管理:Go 語言的軟件包管理絕對不是完美的。默認(rèn)情況下,它沒有辦法制定特定版本的依賴庫,也無法創(chuàng)建可復(fù)寫的 builds。相比之下 Python、Node 和 Ruby 都有更好的軟件包管理系統(tǒng)。然而通過正確的工具,Go 語言的軟件包管理也可以表現(xiàn)得不錯。
缺少開發(fā)框架:Go 語言沒有一個主要的框架,如 Ruby 的 Rails 框架、Python 的 Django 框架或 PHP 的 Laravel。這是 Go 語言社區(qū)激烈討論的問題,因?yàn)樵S多人認(rèn)為我們不應(yīng)該從使用框架開始。在很多案例情況中確實(shí)如此,但如果只是希望構(gòu)建一個簡單的 CRUD API,那么使用 Django/DJRF、Rails Laravel 或 Phoenix 將簡單地多。
異常錯誤處理:Go 語言通過函數(shù)和預(yù)期的調(diào)用代碼簡單地返回錯誤(或返回調(diào)用堆棧)而幫助開發(fā)者處理編譯報錯。雖然這種方法是有效的,但很容易丟失錯誤發(fā)生的范圍,因此我們也很難向用戶提供有意義的錯誤信息。錯誤包(errors package)可以允許我們添加返回錯誤的上下文和堆棧追蹤而解決該問題。
另一個問題是我們可能會忘記處理報錯。諸如 errcheck 和 megacheck 等靜態(tài)分析工具可以避免出現(xiàn)這些失誤。雖然這些解決方案十分有效,但可能并不是那么正確的方法。