go語(yǔ)言實(shí)戰(zhàn)講解 go語(yǔ)言chan

Golang入門到項(xiàng)目實(shí)戰(zhàn) | golang簡(jiǎn)介及安裝

Go(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開(kāi)發(fā)的一種靜態(tài)強(qiáng)類型、編譯型語(yǔ)言。Go 語(yǔ)言語(yǔ)法與 C 相近,但功能上有:內(nèi)存安全,GC(垃圾回收),結(jié)構(gòu)形態(tài)及 CSP-style 并發(fā)計(jì)算。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到科爾沁網(wǎng)站設(shè)計(jì)與科爾沁網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋科爾沁地區(qū)。

go語(yǔ)言特點(diǎn)

go語(yǔ)言的應(yīng)用領(lǐng)域

哪些公司(項(xiàng)目)在使用go語(yǔ)言

下載開(kāi)發(fā)包

windows下安裝

1.打開(kāi)下載的msi可執(zhí)行文件,根據(jù)提示進(jìn)行安裝。默認(rèn)會(huì)安裝在c:/Program Files/go目錄下面。會(huì)自動(dòng)添加go可執(zhí)行文件環(huán)境變量。

2.驗(yàn)證安裝情況

a.打開(kāi)命令行

b. 輸入$ go version

linux下安裝

1.在/usr/local/下面創(chuàng)建一個(gè)目錄go

2.下載壓縮文件到該目錄(/usr/local/go),并解壓縮

3.添加/usr/local/go/bin到PATH環(huán)境變量,打開(kāi)$HOME/.profile 或者/etc/profile輸入如下內(nèi)容:

4.執(zhí)行如下命令使得配置文件及時(shí)生效

驗(yàn)證

1.如果你的mac有Homebrew包管理工具,可以使用它來(lái)安裝

2.如果沒(méi)有下載mac安裝包,根據(jù)提示安裝

3.默認(rèn)安裝在/usr/local/go下面

4.設(shè)置環(huán)境變量,同Linux

Go 語(yǔ)言極速入門13 - 實(shí)戰(zhàn)項(xiàng)目之并發(fā)版爬蟲(chóng)

爬取器 fetcher 和解析器 parser 與之前相同,模型類也不變。

注意:

見(jiàn)本小節(jié)文末分析。

Q1. 為什么在 scheduler 中每一個(gè)將 Request 添加到 chan 的任務(wù)都開(kāi)啟一個(gè) Goroutine 來(lái)執(zhí)行?

A:在 Go 語(yǔ)言學(xué)習(xí)9 - Channel 一節(jié)描述過(guò),對(duì)于無(wú)緩沖的 channel, 如果兩個(gè) goroutine 沒(méi)有同時(shí)準(zhǔn)備好,通道會(huì)導(dǎo)致先執(zhí)行發(fā)送或接收操作的 goroutine 阻塞等待 ,假設(shè)使用 s.workerChan - request 而不是 go func() { s.workerChan - request }() ,假設(shè)開(kāi)啟了 10 個(gè) Worker Goroutine,這 10 個(gè) goroutine 阻塞在 r := -in 阻塞等待獲取 Request 上,假設(shè) seeds 大于 10,例如 11,那么當(dāng) Engine 的這個(gè)循環(huán)執(zhí)行到底 11 個(gè)的時(shí)候,將陷入等待

,因?yàn)樗械?0個(gè) Worker goroutine 此時(shí)都可能也處于等待中,即 in chan 沒(méi)有接收方準(zhǔn)備好接收數(shù)據(jù),所以 engine 作為發(fā)送方也要阻塞等待;那么為什么10個(gè) Worker goroutine 都會(huì)處于等待中呢?

因?yàn)?0個(gè) Worker Goroutine 都處理完了請(qǐng)求,并阻塞在 out - result ,由于 Engine 阻塞在 “將第11個(gè) Request 發(fā)送到 in” 上,所以其無(wú)法進(jìn)行后續(xù)的死循環(huán)去開(kāi)啟 result := -out ,到此為止,相互等待死鎖形成?。?!Engine 等待 Worker 準(zhǔn)備好 r := -in ,而10個(gè) Worker 等待 Engine 的 result := -out 。

當(dāng)使用 go func() { s.workerChan - request }() 之后,Engine Goroutine 將不再阻塞,死鎖等待被打破!??!

Q2. scheduler 方法為何使用指針接收者而不是值接收者?

A:在 Go 語(yǔ)言學(xué)習(xí)5 - 面向接口 中我們?cè)敿?xì)的介紹了什么時(shí)候使用指針接收者,什么時(shí)候使用值接收者,其中最重要的兩條就是 “ 1. 如果要改變接收者內(nèi)部的屬性值,必須使用指針接收者,因?yàn)橹到邮照呤菍?duì)接收者副本的操作;2. 如果 struct 內(nèi)一個(gè)方法是指針接收者,那么其全部方法都是用指針接收者 ”,在 scheduler 中,我們要將外界的 in chan 賦值給 scheduler 的 workChann,所以需要改變 workChann 的值,需要使用指針接收者。

Golang入門到項(xiàng)目實(shí)戰(zhàn) | golang并發(fā)變成之通道channel

Go提供了一種稱為通道的機(jī)制,用于在goroutine之間共享數(shù)據(jù)。當(dāng)您作為goroutine執(zhí)行并發(fā)活動(dòng)時(shí),需要在goroutine之間共享資源或數(shù)據(jù),通道充當(dāng)goroutine之間的管道(管道)并提供一種機(jī)制來(lái)保證同步交換。

根據(jù)數(shù)據(jù)交換的行為,有兩種類型的通道:無(wú)緩沖通道和緩沖通道。無(wú)緩沖通道用于執(zhí)行g(shù)oroutine之間的同步通信,而緩沖通道用于執(zhí)行異步通信。無(wú)緩沖通道保證在發(fā)送和接收發(fā)生的瞬間兩個(gè)goroutine之間的交換。緩沖通道沒(méi)有這樣的保證。

通道由make函數(shù)創(chuàng)建,該函數(shù)指定chan關(guān)鍵字和通道的元素類型。

這是創(chuàng)建無(wú)緩沖和緩沖通道的代碼塊:

語(yǔ)法

使用內(nèi)置函數(shù)make創(chuàng)建無(wú)緩沖和緩沖通道。make的第一個(gè)參數(shù)需要關(guān)鍵字chan,然后是通道允許交換的數(shù)據(jù)類型。

這是將值發(fā)送到通道的代碼塊需要使用-運(yùn)算符:

語(yǔ)法

一個(gè)包含5個(gè)值的緩沖區(qū)的字符串類型的goroutine1通道。然后我們通過(guò)通道發(fā)送字符串“Australia”。

這是從通道接收值的代碼塊:

語(yǔ)法

- 運(yùn)算符附加到通道變量(goroutine1)的左側(cè),以接收來(lái)自通道的值。

在無(wú)緩沖通道中,在接收到任何值之前沒(méi)有能力保存它。在這種類型的通道中,發(fā)送和接收goroutine在任何發(fā)送或接收操作完成之前的同一時(shí)刻都準(zhǔn)備就緒。如果兩個(gè)goroutine沒(méi)有在同一時(shí)刻準(zhǔn)備好,則通道會(huì)讓執(zhí)行其各自發(fā)送或接收操作的goroutine首先等待。同步是通道上發(fā)送和接收之間交互的基礎(chǔ)。沒(méi)有另一個(gè)就不可能發(fā)生。

在緩沖通道中,有能力在接收到一個(gè)或多個(gè)值之前保存它們。在這種類型的通道中,不要強(qiáng)制goroutine在同一時(shí)刻準(zhǔn)備好執(zhí)行發(fā)送和接收。當(dāng)發(fā)送和接收阻塞時(shí)也有不同的條件。只有當(dāng)通道中沒(méi)有要接收的值時(shí),接收才會(huì)阻塞。僅當(dāng)沒(méi)有可用緩沖區(qū)來(lái)放置正在發(fā)送的值時(shí),發(fā)送才會(huì)阻塞。

實(shí)例

運(yùn)行結(jié)果

Golang入門到項(xiàng)目實(shí)戰(zhàn) | golang中的if語(yǔ)句

go語(yǔ)言中的if語(yǔ)句和其他語(yǔ)言中的類似,都是根據(jù)給定的條件表達(dá)式運(yùn)算結(jié)果來(lái),判斷執(zhí)行流程。

注意:在go語(yǔ)言中 布爾表達(dá)式不用使用括號(hào)。

根據(jù)布爾值flag判斷

程序運(yùn)行結(jié)果

初始變量可以聲明在布爾表達(dá)式里面,注意它的作用域

程序運(yùn)行結(jié)果

注意:不能使用0或非0表示真假

go語(yǔ)言if語(yǔ)句使用提示:

go語(yǔ)言中的if else語(yǔ)句可以根據(jù)給定條件二選一。

比較兩個(gè)數(shù)的大小

運(yùn)行結(jié)果

判斷一個(gè)數(shù)是奇數(shù)還是偶數(shù)

運(yùn)行結(jié)果

判斷一個(gè)人是否成年

運(yùn)行結(jié)果

特殊寫(xiě)法,在if前面添加執(zhí)行語(yǔ)句

運(yùn)行結(jié)果

go語(yǔ)言if語(yǔ)句使用提示:

go語(yǔ)言if語(yǔ)句可以進(jìn)行多重嵌套使用,進(jìn)行多重判斷。

根據(jù)分?jǐn)?shù)判斷等級(jí)

運(yùn)行結(jié)果

同樣也可以寫(xiě)成這樣

運(yùn)行結(jié)果

輸入星期幾的第一個(gè)字母來(lái)判斷一下是星期幾,如果第一個(gè)字母一樣,則繼續(xù)判斷第二個(gè)字母

運(yùn)行結(jié)果

go語(yǔ)言if語(yǔ)句可以嵌套多級(jí)進(jìn)行判斷。

判斷三個(gè)數(shù)的大小

運(yùn)行結(jié)果

判斷男生還是女生,還有是否成年

運(yùn)行結(jié)果

文章題目:go語(yǔ)言實(shí)戰(zhàn)講解 go語(yǔ)言chan
URL標(biāo)題:http://muchs.cn/article46/doshjeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、做網(wǎng)站、網(wǎng)站維護(hù)響應(yīng)式網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化