1.Docker項(xiàng)目
蓮湖網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,蓮湖網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為蓮湖近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個(gè)售后服務(wù)好的蓮湖做網(wǎng)站的公司定做!
網(wǎng)址為 。
介紹:Docker是一種操作系統(tǒng)層面的虛擬化技術(shù),可以在操作系統(tǒng)和應(yīng)用程序之間進(jìn)行隔離,也可以稱之為容器。Docker可以在一臺物理服務(wù)器上快速運(yùn)行一個(gè)或多個(gè)實(shí)例。例如,啟動(dòng)一個(gè)Cent OS操作系統(tǒng),并在其內(nèi)部命令行執(zhí)行指令后結(jié)束,整個(gè)過程就像自己在操作系統(tǒng)一樣高效。
2.golang項(xiàng)目
網(wǎng)址為 。
介紹:Go語言的早期源碼使用C語言和匯編語言寫成。從Go 1.5版本自舉后,完全使用Go語言自身進(jìn)行編寫。Go語言的源碼對了解Go語言的底層調(diào)度有極大的參考意義,建議希望對Go語言有深入了解的讀者讀一讀。
3.Kubernetes項(xiàng)目
網(wǎng)址為 。
介紹:Google公司開發(fā)的構(gòu)建于Docker之上的容器調(diào)度服務(wù),用戶可以通過Kubernetes集群進(jìn)行云端容器集群管理。
4.etcd項(xiàng)目
網(wǎng)址為 。
介紹:一款分布式、可靠的KV存儲系統(tǒng),可以快速進(jìn)行云配置。
5.beego項(xiàng)目
網(wǎng)址為 。
介紹:beego是一個(gè)類似Python的Tornado框架,采用了RESTFul的設(shè)計(jì)思路,使用Go語言編寫的一個(gè)極輕量級、高可伸縮性和高性能的Web應(yīng)用框架。
6.martini項(xiàng)目
網(wǎng)址為 。
介紹:一款快速構(gòu)建模塊化的Web應(yīng)用的Web框架。
7.codis項(xiàng)目
網(wǎng)址為 Labs/codis。
介紹:國產(chǎn)的優(yōu)秀分布式Redis解決方案。
8.delve項(xiàng)目
網(wǎng)址為 。
介紹:Go語言強(qiáng)大的調(diào)試器,被很多集成環(huán)境和編輯器整合。
go語言適用的領(lǐng)域有:
Go語言主要用作服務(wù)器端開發(fā),其定位是用來開發(fā)“大型軟件”的,適合于很多程序員一起開發(fā)大型軟件,并且開發(fā)周期長,支持云計(jì)算的網(wǎng)絡(luò)服務(wù)。
Go語言作為服務(wù)器編程語言,很適合處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng)、分布式系統(tǒng)、數(shù)據(jù)庫代理等;網(wǎng)絡(luò)編程方面,Go語言廣泛應(yīng)用于Web應(yīng)用、API應(yīng)用、下載應(yīng)用等;除此之外,Go語言還可用于內(nèi)存數(shù)據(jù)庫和云平臺領(lǐng)域,目前國外很多云平臺都是采用Go開發(fā)。
Go語言能夠讓程序員快速開發(fā),并且在軟件不斷的增長過程中,它能讓程序員更容易地進(jìn)行維護(hù)和修改。它融合了傳統(tǒng)編譯型語言的高效性和腳本語言的易用性和富于表達(dá)性。
Go語言作為一門大型項(xiàng)目開發(fā)語言,在很多大公司相繼使用,甚至完全轉(zhuǎn)向Go開發(fā),其中代表有Google、Facebook、騰訊、百度、阿里巴巴、京東、小米以及360、美團(tuán)、滴滴以及新浪等,因此,Go語言的開發(fā)前景還是很不錯(cuò)的!
為什么需要context
在go服務(wù)器中,對于每個(gè)請求的request都是在單獨(dú)的goroutine中進(jìn)行的,處理一個(gè)request也可能設(shè)計(jì)多個(gè)goroutine之間的交互, 使用context可以使開發(fā)者方便的在這些goroutine里傳遞request相關(guān)的數(shù)據(jù)、取消goroutine的signal或截止日期
在并發(fā)程序中,由于超時(shí)、取消操作或者一些異常情況,往往需要進(jìn)行搶占操作或者中斷后續(xù)操作。熟悉channel的朋友應(yīng)該都見過使用done channel來處理此類問題。比如以下這個(gè)例子:
上述例子中定義了一個(gè)buffer為0的channel done, 子協(xié)程運(yùn)行著定時(shí)任務(wù)。如果主協(xié)程需要在某個(gè)時(shí)刻發(fā)送消息通知子協(xié)程中斷任務(wù)退出,那么就可以讓子協(xié)程監(jiān)聽這個(gè)done channel,一旦主協(xié)程關(guān)閉done channel,那么子協(xié)程就可以推出了,這樣就實(shí)現(xiàn)了主協(xié)程通知子協(xié)程的需求。這很好,但是這也是有限的。
如果我們可以在簡單的通知上附加傳遞額外的信息來控制取消:為什么取消,或者有一個(gè)它必須要完成的最終期限,更或者有多個(gè)取消選項(xiàng),我們需要根據(jù)額外的信息來判斷選擇執(zhí)行哪個(gè)取消選項(xiàng)。
考慮下面這種情況:假如主協(xié)程中有多個(gè)任務(wù)1, 2, …m,主協(xié)程對這些任務(wù)有超時(shí)控制;而其中任務(wù)1又有多個(gè)子任務(wù)1, 2, …n,任務(wù)1對這些子任務(wù)也有自己的超時(shí)控制,那么這些子任務(wù)既要感知主協(xié)程的取消信號,也需要感知任務(wù)1的取消信號。
如果還是使用done channel的用法,我們需要定義兩個(gè)done channel,子任務(wù)們需要同時(shí)監(jiān)聽這兩個(gè)done channel。嗯,這樣其實(shí)好像也還行哈。但是如果層級更深,如果這些子任務(wù)還有子任務(wù),那么使用done channel的方式將會變得非常繁瑣且混亂。
我們需要一種優(yōu)雅的方案來實(shí)現(xiàn)這樣一種機(jī)制:
上層任務(wù)取消后,所有的下層任務(wù)都會被取消;中間某一層的任務(wù)取消后,只會將當(dāng)前任務(wù)的下層任務(wù)取消,而不會影響上層的任務(wù)以及同級任務(wù)。
這個(gè)時(shí)候context就派上用場了。我們首先看看context的結(jié)構(gòu)設(shè)計(jì)和實(shí)現(xiàn)原理。
context接口
先看Context接口結(jié)構(gòu),看起來非常簡單。
}
Context接口包含四個(gè)方法:
Deadline返回綁定當(dāng)前context的任務(wù)被取消的截止時(shí)間;如果沒有設(shè)定期限,將返回ok == false。
Done 當(dāng)綁定當(dāng)前context的任務(wù)被取消時(shí),將返回一個(gè)關(guān)閉的channel;如果當(dāng)前context不會被取消,將返回nil。
Err 如果Done返回的channel沒有關(guān)閉,將返回nil;如果Done返回的channel已經(jīng)關(guān)閉,將返回非空的值表示任務(wù)結(jié)束的原因。如果是context被取消,Err將返回Canceled;如果是context超時(shí),Err將返回DeadlineExceeded。
Value 返回context存儲的鍵值對中當(dāng)前key對應(yīng)的值,如果沒有對應(yīng)的key,則返回nil。
可以看到Done方法返回的channel正是用來傳遞結(jié)束信號以搶占并中斷當(dāng)前任務(wù);Deadline方法指示一段時(shí)間后當(dāng)前goroutine是否會被取消;以及一個(gè)Err方法,來解釋goroutine被取消的原因;而Value則用于獲取特定于當(dāng)前任務(wù)樹的額外信息。而context所包含的額外信息鍵值對是如何存儲的呢?其實(shí)可以想象一顆樹,樹的每個(gè)節(jié)點(diǎn)可能攜帶一組鍵值對,如果當(dāng)前節(jié)點(diǎn)上無法找到key所對應(yīng)的值,就會向上去父節(jié)點(diǎn)里找,直到根節(jié)點(diǎn)。
emptyCtx
emptyCtx是一個(gè)int類型的變量,但實(shí)現(xiàn)了context的接口。emptyCtx沒有超時(shí)時(shí)間,不能取消,也不能存儲任何額外信息,所以emptyCtx用來作為context樹的根節(jié)點(diǎn)。
Background和TODO只是用于不同場景下: Background通常被用于主函數(shù)、初始化以及測試中,作為一個(gè)頂層的context,也就是說一般我們創(chuàng)建的context都是基于Background;而TODO是在不確定使用什么context的時(shí)候才會使用。
用法 :
1、服務(wù)器編程:以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng)等。
2、分布式系統(tǒng)、數(shù)據(jù)庫代理器、中間件:例如Etcd。
3、網(wǎng)絡(luò)編程:這一塊目前應(yīng)用最廣,包括Web應(yīng)用、API應(yīng)用、下載應(yīng)用,而且Go內(nèi)置的net/http包基本上把我們平常用到的網(wǎng)絡(luò)功能都實(shí)現(xiàn)了。
4、開發(fā)云平臺:目前國外很多云平臺在采用Go開發(fā),我們所熟知的七牛云、華為云等等都有使用Go進(jìn)行開發(fā)并且開源的成型的產(chǎn)品。
5、區(qū)塊鏈:目前有一種說法,技術(shù)從業(yè)人員把Go語言稱作為區(qū)塊鏈行業(yè)的開發(fā)語言。如果大家學(xué)習(xí)區(qū)塊鏈技術(shù)的話,就會發(fā)現(xiàn)現(xiàn)在有很多很多的區(qū)塊鏈的系統(tǒng)和應(yīng)用都是采用Go進(jìn)行開發(fā)的,比如ehtereum是目前知名度最大的公鏈,再比如fabric是目前最知名的聯(lián)盟鏈,兩者都有g(shù)o語言的版本,且go-ehtereum還是以太坊官方推薦的版本。
自1.0版發(fā)布以來,go語言引起了眾多開發(fā)者的關(guān)注,并得到了廣泛的應(yīng)用。go語言簡單、高效、并發(fā)的特點(diǎn)吸引了許多傳統(tǒng)的語言開發(fā)人員,其數(shù)量也在不斷增加。
使用 Go 語言開發(fā)的開源項(xiàng)目非常多。早期的 Go 語言開源項(xiàng)目只是通過 Go 語言與傳統(tǒng)項(xiàng)目進(jìn)行C語言庫綁定實(shí)現(xiàn),例如 Qt、Sqlite 等。
后期的很多項(xiàng)目都使用 Go 語言進(jìn)行重新原生實(shí)現(xiàn),這個(gè)過程相對于其他語言要簡單一些,這也促成了大量使用 Go 語言原生開發(fā)項(xiàng)目的出現(xiàn)。
一直直接操作的框架 使用vscode 打開就會自動(dòng)裝包,這次想寫一個(gè)簡單應(yīng)用,確不會怎么建項(xiàng)目,記錄如下。
go1.14 后,以及不再需要把項(xiàng)目寫在GOPATH下,所有不需要再配置。
配置GOPRXY goenv-w GOPROXY=(國內(nèi)無法訪問)
使用go mod方法新建項(xiàng)目。
任意位置新建文件夾。
文件夾下執(zhí)行g(shù)o mod xxx ,生成一個(gè)go.mod文件。
新建一個(gè)main.go文件,就可以直接運(yùn)行了。
我開始的時(shí)候,先建了main.go文件,再執(zhí)行的go.mod。后面沒法運(yùn)行。
參考:李文周的博客。
網(wǎng)站欄目:go語言做TODO項(xiàng)目 go語言 項(xiàng)目
本文鏈接:http://www.chinadenli.net/article10/hpgcgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、商城網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、企業(yè)建站、網(wǎng)站收錄、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)