1. 保留但大幅度簡化指針
江岸ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
Go語言保留著C中值和指針的區(qū)別,但是對于指針繁瑣用法進(jìn)行了大量的簡化,引入引用的概念。所以在Go語言中,你幾乎不用擔(dān)心會因為直接操作內(nèi)寸而引起各式各樣的錯誤。
2. 多參數(shù)返回
還記得在C里面為了回饋多個參數(shù),不得不開辟幾段指針傳到目標(biāo)函數(shù)中讓其操作么?在Go里面這是完全不必要的。而且多參數(shù)的支持讓Go無需使用繁瑣的exceptions體系,一個函數(shù)可以返回期待的返回值加上error,調(diào)用函數(shù)后立刻處理錯誤信息,清晰明了。
3. Array,slice,map等內(nèi)置基本數(shù)據(jù)結(jié)構(gòu)
如果你習(xí)慣了Python中簡潔的list和dict操作,在Go語言中,你不會感到孤單。一切都是那么熟悉,而且更加高效。如果你是C++程序員,你會發(fā)現(xiàn)你又找到了STL的vector 和 map這對朋友。
4. Interface
Go語言最讓人贊嘆不易的特性,就是interface的設(shè)計。任何數(shù)據(jù)結(jié)構(gòu),只要實現(xiàn)了interface所定義的函數(shù),自動就implement了這個interface,沒有像Java那樣冗長的class申明,提供了靈活太多的設(shè)計度和OO抽象度,讓你的代碼也非常干凈。千萬不要以為你習(xí)慣了Java那種一條一條加implements的方式,感覺還行,等接口的設(shè)計越來越復(fù)雜的時候,無數(shù)Bug正在后面等著你。
同時,正因為如此,Go語言的interface可以用來表示任何generic的東西,比如一個空的interface,可以是string可以是int,可以是任何數(shù)據(jù)類型,因為這些數(shù)據(jù)類型都不需要實現(xiàn)任何函數(shù),自然就滿足空interface的定義了。加上Go語言的type assertion,可以提供一般動態(tài)語言才有的duck typing特性, 而仍然能在compile中捕捉明顯的錯誤。
5. OO
Go語言本質(zhì)上不是面向?qū)ο笳Z言,它還是過程化的。但是,在Go語言中, 你可以很輕易的做大部分你在別的OO語言中能做的事,用更簡單清晰的邏輯。是的,在這里,不需要class,仍然可以繼承,仍然可以多態(tài),但是速度卻快得多。因為本質(zhì)上,OO在Go語言中,就是普通的struct操作。
6. Goroutine
這個幾乎算是Go語言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,這玩意是超級輕量級的類似線程的東西,但通過它,你不需要復(fù)雜的線程操作鎖操作,不需要care調(diào)度,就能玩轉(zhuǎn)基本的并行程序。在Go語言里,觸發(fā)一個routine和erlang spawn一樣簡單。基本上要掌握Go語言,以Goroutine和channel為核心的內(nèi)存模型是必須要懂的。不過請放心,真的非常簡單。
7. 更多現(xiàn)代的特性
和C比較,Go語言完全就是一門現(xiàn)代化語言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language類似), function是first class object,等等等等。
看到這里,你可能會發(fā)現(xiàn),我用了很多輕易,簡單,快速之類的形容詞來形容Go語言的特點。我想說的是,一點都不夸張,連Go語言的入門學(xué)習(xí)到提高,都比別的語言門檻低太多太多。在大部分人都有C的背景的時代,對于Go語言,從入門到能夠上手做項目,最多不過半個月。Go語言給人的感覺就是太直接了,什么都直接,讀源代碼直接,寫自己的代碼也直接。
Hello,大家好,又見面了!上一遍我們將 channel 相關(guān)基礎(chǔ)以及使用場景。這一篇,還需要再次進(jìn)階理解channel 阻塞問題。以下創(chuàng)建一個chan類型為int,cap 為3。
channel 內(nèi)部其實是一個環(huán)形buf數(shù)據(jù)結(jié)構(gòu) ,是一種滑動窗口機制,當(dāng)make完后,就分配在 Heap 上。
上面,向 chan 發(fā)送一條“hello”數(shù)據(jù):
如果 G1 發(fā)送數(shù)據(jù)超過指定cap時,會出現(xiàn)什么情況?
看下面實例:
以上會出現(xiàn)什么,chan 緩沖區(qū)允許大小為1,如果再往chan仍數(shù)據(jù),滿了就會被阻塞,那么是如何實現(xiàn)阻塞的呢?當(dāng) chan 滿時,會進(jìn)入 gopark,此時 G1 進(jìn)入一個 waiting 狀態(tài),然后會創(chuàng)建一個 sudog 對象,其實就sendq隊列,把 200放進(jìn)去。等 buf 不滿的時候,再喚醒放入buf里面。
通過如下源碼,你會更加清晰:
上面,從 chan 獲取數(shù)據(jù):
Go 語言核心思想:“Do not communicate by sharing memory; instead, share memory by communicating.” 你可以看看這本書名叫:Effective Go
如果接收者,接收一個空對象,也會發(fā)生什么情況?
代碼示例 :
也會報錯如下:
上面,從 chan 取出數(shù)據(jù),可是沒有數(shù)據(jù)了。此時,它會把 接收者 G2 阻塞掉,也是和G1發(fā)送者一樣,也會執(zhí)行 gopark 將狀態(tài)改為 waiting,不一樣的點就是。
正常情況下,接收者G2作為取出數(shù)據(jù)是去 buf 讀取數(shù)據(jù)的,但現(xiàn)在,buf 為空了,此時,接收者G2會將sudog導(dǎo)出來,因為現(xiàn)在G2已經(jīng)被阻塞了嘛,會把G2給G,然后將 t := -ch 中變量 t 是在棧上的地址,放進(jìn)去 elem ,也就是說,只存它的地址指針在sudog里面。
最后, ch - 200 當(dāng)G1往 chan 添加200這個數(shù)據(jù),正常情況是將數(shù)據(jù)添加到buf里面,然后喚醒 G2 是吧,而現(xiàn)在是將 G1 的添加200數(shù)據(jù)直接干到剛才G2阻塞的t這里變量里面。
你會認(rèn)為,這樣真的可以嗎?想一想,G2 本來就是已經(jīng)阻塞了,然后我們直接這么干肯定沒有什么毛病,而且效率提高了,不需要再次放入buf再取出,這個過程也是需要時間。不然,不得往chan添加數(shù)據(jù)需要加鎖、拷貝、解鎖一序列操作,那肯定就慢了,我想Go語言是為了高效及內(nèi)存使用率的考慮這樣設(shè)計的。(注意,一般都是在runtime里面完成,不然會出現(xiàn)象安全問題。)
總結(jié) :
chan 類型的特點:chan 如果為空,receiver 接收數(shù)據(jù)的時候就會阻塞等待,直到 chan 被關(guān)閉或者有新的數(shù)據(jù)到來。有這種個機制,就可以實現(xiàn) wait/notify 的設(shè)計模式。
相關(guān)面試題:
go嚴(yán)格上說沒有多態(tài),但可以利用接口進(jìn)行,對于都實現(xiàn)了同一接口的兩種對象,可以進(jìn)行類似地向上轉(zhuǎn)型,并且在此時可以對方法進(jìn)行多態(tài)路由分發(fā)。慕課網(wǎng)上線的新版Go語言不僅有提到這一點,還提到了Go在不面對對象的情況下是怎么完成封裝和繼承的,老師講得很通透,搭配經(jīng)典算法、典型例題、微型項目深入講授go語言。然后還會教學(xué)員從零開始搭建分布式爬蟲系統(tǒng),學(xué)會用go語言處理復(fù)雜項目。
本文名稱:go語言空對象 go語言面向?qū)ο缶幊?/a>
鏈接URL:http://jinyejixie.com/article12/dodpjdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、移動網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站改版、用戶體驗、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)