有編程基礎(chǔ)還是對(duì)于學(xué)習(xí)區(qū)塊鏈很有優(yōu)勢(shì)的。
創(chuàng)新互聯(lián)2013年至今,先為月湖等服務(wù)建站,月湖等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為月湖企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
Go語(yǔ)言+區(qū)塊鏈培訓(xùn)課程可以了解一下:
從語(yǔ)言本身特點(diǎn)來(lái)看,Go 是一種非常高效的語(yǔ)言,高度支持并發(fā)性,Go 語(yǔ)言的本身,它更注重的是分布式系統(tǒng),并發(fā)處理相對(duì)還是不錯(cuò)的,比如廣告和搜索,那種高并發(fā)的服務(wù)器。
Go語(yǔ)言?xún)?yōu)點(diǎn):
性能優(yōu)秀,可直接編譯成機(jī)器碼,不依賴(lài)其他庫(kù),Go 極其地快。其性能與 Java 或 C++相似。
語(yǔ)言層面支持并發(fā),這個(gè)就是Go最大的特色,天生的支持并發(fā),Go就是基因里面支持的并發(fā),可以充分的利用多核,很容易的使用并發(fā)。
內(nèi)置runtime,支持垃圾回收,這屬于動(dòng)態(tài)語(yǔ)言的特性之一吧,雖然目前來(lái)說(shuō)GC不算完美,但是足以應(yīng)付我們所能遇到的大多數(shù)情況,特別是Go1.1之后的GC。
簡(jiǎn)單易學(xué),Go語(yǔ)言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go關(guān)鍵字是25個(gè),但是表達(dá)能力很強(qiáng)大,幾乎支持大多數(shù)你在其他語(yǔ)言見(jiàn)過(guò)的特性:繼承、重載、對(duì)象等。
豐富的標(biāo)準(zhǔn)庫(kù),Go目前已經(jīng)內(nèi)置了大量的庫(kù),特別是網(wǎng)絡(luò)庫(kù)非常強(qiáng)大,我最?lèi)?ài)的也是這部分。
內(nèi)置強(qiáng)大的工具,Go語(yǔ)言里面內(nèi)置了很多工具鏈,最好的應(yīng)該是gofmt工具,自動(dòng)化格式化代碼,能夠讓團(tuán)隊(duì)review變得如此的簡(jiǎn)單,代碼格式一模一樣,想不一樣都很困難。
跨平臺(tái)編譯,快速編譯,相較于 Java 和 C++呆滯的編譯速度,Go 的快速編譯時(shí)間是一個(gè)主要的效率優(yōu)勢(shì)
Go語(yǔ)言缺點(diǎn):
軟件包管理:Go 語(yǔ)言的軟件包管理絕對(duì)不是完美的。默認(rèn)情況下,它沒(méi)有辦法制定特定版本的依賴(lài)庫(kù),也無(wú)法創(chuàng)建可復(fù)寫(xiě)的 builds。相比之下 Python、Node 和 Ruby 都有更好的軟件包管理系統(tǒng)。然而通過(guò)正確的工具,Go 語(yǔ)言的軟件包管理也可以表現(xiàn)得不錯(cuò)。
缺少開(kāi)發(fā)框架:Go 語(yǔ)言沒(méi)有一個(gè)主要的框架,如 Ruby 的 Rails 框架、Python 的 Django 框架或 PHP 的 Laravel。這是 Go 語(yǔ)言社區(qū)激烈討論的問(wèn)題,因?yàn)樵S多人認(rèn)為我們不應(yīng)該從使用框架開(kāi)始。在很多案例情況中確實(shí)如此,但如果只是希望構(gòu)建一個(gè)簡(jiǎn)單的 CRUD API,那么使用 Django/DJRF、Rails Laravel 或 Phoenix 將簡(jiǎn)單地多。
異常錯(cuò)誤處理:Go 語(yǔ)言通過(guò)函數(shù)和預(yù)期的調(diào)用代碼簡(jiǎn)單地返回錯(cuò)誤(或返回調(diào)用堆棧)而幫助開(kāi)發(fā)者處理編譯報(bào)錯(cuò)。雖然這種方法是有效的,但很容易丟失錯(cuò)誤發(fā)生的范圍,因此我們也很難向用戶(hù)提供有意義的錯(cuò)誤信息。錯(cuò)誤包(errors package)可以允許我們添加返回錯(cuò)誤的上下文和堆棧追蹤而解決該問(wèn)題。
另一個(gè)問(wèn)題是我們可能會(huì)忘記處理報(bào)錯(cuò)。諸如 errcheck 和 megacheck 等靜態(tài)分析工具可以避免出現(xiàn)這些失誤。雖然這些解決方案十分有效,但可能并不是那么正確的方法。
Go語(yǔ)言包含了類(lèi)C語(yǔ)法、GC內(nèi)置和工程工具。這一點(diǎn)非常重要,因?yàn)镚o語(yǔ)言容易學(xué)習(xí),所以一個(gè)普通的大學(xué)生花一個(gè)星期就能寫(xiě)出來(lái)可以上手的、高性能的應(yīng)用。在國(guó)內(nèi)大家都追求快,這也是為什么國(guó)內(nèi)Go流行的原因之一。黑馬程序員近期除了20小時(shí)快速入門(mén)Go語(yǔ)言教程,你可以去看看哦,到時(shí)候你就會(huì)發(fā)現(xiàn)真的是比較容易學(xué)的。
Go語(yǔ)言。他主要是在一些網(wǎng)頁(yè)版的服務(wù)器中用于系統(tǒng)編程的一種語(yǔ)言。他是谷歌開(kāi)發(fā)的一種編程語(yǔ)言。在一定程度上,谷歌有一定的壟斷作用。不能隨隨便便的在語(yǔ)言當(dāng)中添加其他的語(yǔ)言成分。
C++適合本地程序的開(kāi)發(fā)。Go語(yǔ)言適合網(wǎng)絡(luò)程序和本地程序的開(kāi)發(fā)。Go的優(yōu)點(diǎn):垃圾回收,語(yǔ)意明確,格式統(tǒng)一。?Go的缺點(diǎn):效率目前沒(méi)有C++高,但對(duì)于桌面程序而言,效率問(wèn)題不大,因?yàn)橛布呀?jīng)很快了。c++過(guò)于復(fù)雜了,加入很多炫技的內(nèi)容。這些內(nèi)容脫離了事情的本質(zhì)。
最明顯的就是所謂的面向?qū)ο蟆;诿嫦驅(qū)ο蟮墓こ倘绻銐虼蟮那闆r下,會(huì)帶來(lái)很大的耦合度,如果再加上內(nèi)存管理,多線(xiàn)程等等。項(xiàng)目后期基本上沒(méi)辦法維護(hù)和增加功能。
關(guān)于c++的語(yǔ)言復(fù)雜性,你可以問(wèn)知乎上的任何一位高手。沒(méi)一個(gè)敢說(shuō)自己精通c++。你也可以去看一下所有的c++編繹器,沒(méi)有任何一個(gè)敢說(shuō)自己完全實(shí)現(xiàn)了c++的標(biāo)準(zhǔn)。不同的編繹器之間實(shí)現(xiàn)細(xì)節(jié)又不同。所以功能再?gòu)?qiáng)大沒(méi)有實(shí)用性,就失去了意義,只會(huì)制造更多的問(wèn)題。
就目前來(lái)看還是很有前景,因?yàn)樵絹?lái)越火了,不過(guò)他的應(yīng)用領(lǐng)域還是局限在高并發(fā)處理和網(wǎng)站開(kāi)發(fā),畢竟是后起之秀所以在其他桌面程序領(lǐng)域沒(méi)那么容易普及和超越c++,找工作就不推薦學(xué)go
三次握手:
1. 主動(dòng)發(fā)起連接請(qǐng)求端(客戶(hù)端),發(fā)送 SYN 標(biāo)志位,攜帶數(shù)據(jù)包、包號(hào)
2. 被動(dòng)接收連接請(qǐng)求端(服務(wù)器),接收 SYN,回復(fù) ACK,攜帶應(yīng)答序列號(hào)。同時(shí),發(fā)送SYN標(biāo)志位,攜帶數(shù)據(jù)包、包號(hào)
3. 主動(dòng)發(fā)起連接請(qǐng)求端(客戶(hù)端),接收SYN 標(biāo)志位,回復(fù) ACK。
被動(dòng)端(服務(wù)器)接收 ACK —— 標(biāo)志著 三次握手建立完成( Accept()/Dial() 返回 )
四次揮手:
1. 主動(dòng)請(qǐng)求斷開(kāi)連接端(客戶(hù)端), 發(fā)送 FIN標(biāo)志,攜帶數(shù)據(jù)包
2. 被動(dòng)接受斷開(kāi)連接端(服務(wù)器), 發(fā)送 ACK標(biāo)志,攜帶應(yīng)答序列號(hào)。 —— 半關(guān)閉完成。
3. 被動(dòng)接受斷開(kāi)連接端(服務(wù)器), 發(fā)送 FIN標(biāo)志,攜帶數(shù)據(jù)包
4. 主動(dòng)請(qǐng)求斷開(kāi)連接端(客戶(hù)端), 發(fā)送 最后一個(gè) ACK標(biāo)志,攜帶應(yīng)答序列號(hào)。—— 發(fā)送完成,客戶(hù)端不會(huì)直接退出,等 2MSL時(shí)長(zhǎng)。
等 2MSL待目的:確保服務(wù)器 收到最后一個(gè)ACK
滑動(dòng)窗口:
通知對(duì)端本地存儲(chǔ)數(shù)據(jù)的 緩沖區(qū)容量?!?write 函數(shù)在對(duì)端 緩沖區(qū)滿(mǎn)時(shí),有可能阻塞。
TCP狀態(tài)轉(zhuǎn)換:
1. 主動(dòng)發(fā)起連接請(qǐng)求端:
CLOSED —— 發(fā)送SYN —— SYN_SENT(了解) —— 接收ACK、SYN,回發(fā) ACK —— ESTABLISHED (數(shù)據(jù)通信)
2. 主動(dòng)關(guān)閉連接請(qǐng)求端:
ESTABLISHED —— 發(fā)送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半關(guān)閉、主動(dòng)端)
—— 接收FIN、回復(fù)ACK —— TIME_WAIT (主動(dòng)端) —— 等 2MSL 時(shí)長(zhǎng) —— CLOSED
3. 被動(dòng)建立連接請(qǐng)求端:
CLOSED —— LISTEN —— 接收SYN、發(fā)送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (數(shù)據(jù)通信)
4. 被動(dòng)斷開(kāi)連接請(qǐng)求端:
ESTABLISHED —— 接收 FIN、發(fā)送 ACK —— CLOSE_WAIT —— 發(fā)送 FIN —— LAST_ACK —— 接收ACK —— CLOSED
windows下查看TCP狀態(tài)轉(zhuǎn)換:
netstat -an | findstr? 端口號(hào)
Linux下查看TCP狀態(tài)轉(zhuǎn)換:
netstat -an | grep? 端口號(hào)
TCP和UDP對(duì)比:?
TCP: 面向連接的可靠的數(shù)據(jù)包傳遞。 針對(duì)不穩(wěn)定的 網(wǎng)絡(luò)層,完全彌補(bǔ)。ACK
UDP:無(wú)連接不可靠的報(bào)文傳輸。 針對(duì)不穩(wěn)定的 網(wǎng)絡(luò)層,完全不彌補(bǔ)。還原網(wǎng)絡(luò)真實(shí)狀態(tài)。
優(yōu)點(diǎn)???????????????????????????????????????????????????????????? 缺點(diǎn)
TCP: 可靠、順序、穩(wěn)定 ???????????????????????????????????? 系統(tǒng)資源消耗大,程序?qū)崿F(xiàn)繁復(fù)、速度慢
UDP:系統(tǒng)資源消耗小,程序?qū)崿F(xiàn)簡(jiǎn)單、速度快 ???????????????????????? 不可靠、無(wú)序、不穩(wěn)定
使用場(chǎng)景:
TCP:大文件、可靠數(shù)據(jù)傳輸。 對(duì)數(shù)據(jù)的 穩(wěn)定性、準(zhǔn)確性、一致性要求較高的場(chǎng)合。
UDP:應(yīng)用于對(duì)數(shù)據(jù)時(shí)效性要求較高的場(chǎng)合。 網(wǎng)絡(luò)直播、電話(huà)會(huì)議、視頻直播、網(wǎng)絡(luò)游戲。
UDP-CS-Server實(shí)現(xiàn)流程:
1.? 創(chuàng)建 udp地址結(jié)構(gòu) ResolveUDPAddr(“協(xié)議”, “IP:port”) —— udpAddr 本質(zhì) struct{IP、port}
2.? 創(chuàng)建用于 數(shù)據(jù)通信的 socket ListenUDP(“協(xié)議”, udpAddr ) —— udpConn (socket)
3.? 從客戶(hù)端讀取數(shù)據(jù),獲取對(duì)端的地址 udpConn.ReadFromUDP() —— 返回:n,clientAddr, err
4.? 發(fā)送數(shù)據(jù)包給 客戶(hù)端 udpConn.WriteToUDP("數(shù)據(jù)", clientAddr)
UDP-CS-Client實(shí)現(xiàn)流程:
1.? 創(chuàng)建用于通信的 socket。 net.Dial("udp", "服務(wù)器IP:port") —— udpConn (socket)
2.? 以后流程參見(jiàn) TCP客戶(hù)端實(shí)現(xiàn)源碼。
UDPserver默認(rèn)就支持并發(fā)!
------------------------------------
命令行參數(shù): 在main函數(shù)啟動(dòng)時(shí),向整個(gè)程序傳參。 【重點(diǎn)】
語(yǔ)法: go run xxx.go ? argv1 argv2? argv3? argv4 。。。
xxx.exe:? 第 0 個(gè)參數(shù)。
argv1 :第 1 個(gè)參數(shù)。
argv2 :第 2 個(gè)參數(shù)。
argv3 :第 3 個(gè)參數(shù)。
argv4 :第 4 個(gè)參數(shù)。
使用: list := os.Args? 提取所有命令行參數(shù)。
獲取文件屬性函數(shù):
os.stat(文件訪(fǎng)問(wèn)絕對(duì)路徑) —— fileInfo 接口
fileInfo 包含 兩個(gè)接口。
Name() 獲取文件名。 不帶訪(fǎng)問(wèn)路徑
Size() 獲取文件大小。
網(wǎng)絡(luò)文件傳輸 —— 發(fā)送端(客戶(hù)端)
1.? 獲取命令行參數(shù),得到文件名(帶路徑)filePath list := os.Args
2.? 使用 os.stat() 獲取 文件名(不帶路徑)fileName
3.? 創(chuàng)建 用于數(shù)據(jù)傳輸?shù)?socket? net.Dial("tcp", “服務(wù)器IP+port”) —— conn
4.? 發(fā)送文件名(不帶路徑)? 給接收端, conn.write()
5.? 讀取 接收端回發(fā)“ok”,判斷無(wú)誤。封裝函數(shù) sendFile(filePath, conn) 發(fā)送文件內(nèi)容
6.? 實(shí)現(xiàn) sendFile(filePath,? conn)
1) 只讀打開(kāi)文件 os.Open(filePath)
for {
2) 從文件中讀數(shù)據(jù)? f.Read(buf)
3) 將讀到的數(shù)據(jù)寫(xiě)到socket中? conn.write(buf[:n])
4)判斷讀取文件的 結(jié)尾。 io.EOF. 跳出循環(huán)
}
網(wǎng)絡(luò)文件傳輸 —— 接收端(服務(wù)器)
1. 創(chuàng)建用于監(jiān)聽(tīng)的 socket net.Listen() —— listener
2. 借助listener 創(chuàng)建用于 通信的 socket listener.Accpet()? —— conn
3. 讀取 conn.read() 發(fā)送端的 文件名, 保存至本地。
4. 回發(fā) “ok”應(yīng)答 發(fā)送端。
5. 封裝函數(shù),接收文件內(nèi)容 recvFile(文件路徑)
1) f = os.Create(帶有路徑的文件名)
for {
2)從 socket中讀取發(fā)送端發(fā)送的 文件內(nèi)容 。 conn.read(buf)
3)? 將讀到的數(shù)據(jù) 保存至本地文件 f.Write(buf[:n])
4)? 判斷 讀取conn 結(jié)束, 代表文件傳輸完成。 n == 0? break
}