版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
讓我們一起來(lái)學(xué)習(xí)
GO語(yǔ)言編程晨笛目錄為什么我們需要Go語(yǔ)言1Go語(yǔ)言的簡(jiǎn)介2面向?qū)ο缶幊?Go語(yǔ)言語(yǔ)法32并發(fā)編程5系統(tǒng)開(kāi)發(fā)現(xiàn)狀C/C++寫(xiě)的好的話(huà)速度快,內(nèi)存利用率高寫(xiě)不好的話(huà)內(nèi)存泄露Coredump語(yǔ)言層面完全沒(méi)有對(duì)并發(fā)有支持裸用os的并發(fā)機(jī)制:線(xiàn)程/進(jìn)程系統(tǒng)開(kāi)發(fā)現(xiàn)狀Java速度快,語(yǔ)言不靈活語(yǔ)言層面有一定的并發(fā)支持,基于os并發(fā)機(jī)制PHP/Python/Ruby開(kāi)發(fā)速度快,靈活速度慢語(yǔ)言層面依舊裸用os的并發(fā)機(jī)制,甚至不提供或者有限制〔GIL〕Twisted/asyncore/Multiprocess新的編程模型〔CSP〕在語(yǔ)言層面參加對(duì)并發(fā)支持而不是以庫(kù)形式提供更高層次的并發(fā)抽象而不是直接暴露os的并發(fā)機(jī)制應(yīng)用ErlangOcamlGO并發(fā)模型GoroutineChannelRpc內(nèi)存模型為什么我們需要Go語(yǔ)言7是什么促使Go的出現(xiàn)隨著機(jī)器性能的提升、軟件規(guī)模與復(fù)雜度的提高,Java逐步取代了單機(jī)時(shí)代的編程之王C語(yǔ)言的位置。然后Java編程的體驗(yàn)并未盡如人意。歷年來(lái)的編程語(yǔ)言排行榜顯示,Java語(yǔ)言的市場(chǎng)份額在逐步下跌。Go語(yǔ)言此時(shí)應(yīng)運(yùn)而生,Go語(yǔ)言官方自稱(chēng)Go語(yǔ)言的出現(xiàn)是因?yàn)椤敖?0年來(lái)開(kāi)發(fā)程序之難讓我們有點(diǎn)沮喪”。Go希望成為互聯(lián)網(wǎng)時(shí)代的C語(yǔ)言。為什么我們需要Go語(yǔ)言8互聯(lián)網(wǎng)時(shí)代的C語(yǔ)言需要考慮哪些關(guān)鍵問(wèn)題呢并行與分布式支持多核化和集群化是互聯(lián)網(wǎng)時(shí)代的典型特征。軟件工程支持互聯(lián)網(wǎng)時(shí)代C語(yǔ)言需要考慮軟件品質(zhì)保障和團(tuán)隊(duì)協(xié)作相關(guān)的話(huà)題編程哲學(xué)的重塑互聯(lián)網(wǎng)時(shí)代C語(yǔ)言需要答復(fù)什么才是最正確的編程實(shí)踐這個(gè)問(wèn)題。為什么我們需要Go語(yǔ)言9Go語(yǔ)言的在這些問(wèn)題上的處理并行與分布式支持并發(fā)執(zhí)行的“執(zhí)行體”。Go語(yǔ)言在語(yǔ)言級(jí)別支持協(xié)程〔微線(xiàn)程〕。多數(shù)語(yǔ)言在語(yǔ)法層面并不直接支持協(xié)程,而通過(guò)庫(kù)的方式支持協(xié)程的功能也不完整。執(zhí)行體間的互斥和同步。Go語(yǔ)言提供協(xié)程之間的互斥和同步。執(zhí)行體間的消息傳遞。多數(shù)語(yǔ)言在并發(fā)編程模型上選擇了共享內(nèi)存模型,而Go語(yǔ)言選擇了消息隊(duì)列模型。軟件工程支持Go語(yǔ)言可能是第一個(gè)將代碼風(fēng)格強(qiáng)制統(tǒng)一的語(yǔ)言。為什么我們需要Go語(yǔ)言10Go語(yǔ)言的在這些問(wèn)題上的處理編程哲學(xué)的重塑Go語(yǔ)言用批判吸收的眼光,融合眾家之長(zhǎng),但時(shí)刻警惕特性復(fù)雜化,竭力維持語(yǔ)言特性的簡(jiǎn)潔,力求小而精。Go語(yǔ)言反對(duì)函數(shù)和操作符重載Go語(yǔ)言放棄構(gòu)造和析構(gòu)函數(shù)Go語(yǔ)言支持類(lèi)、類(lèi)成員方法、類(lèi)的組合,但反對(duì)繼承,反對(duì)虛函數(shù)和虛函數(shù)重載為什么我們需要Go語(yǔ)言11Go語(yǔ)言的目標(biāo)提升現(xiàn)有編程語(yǔ)言對(duì)程序庫(kù)等依賴(lài)性(dependency)的管理。解決多處理器的任務(wù)Go語(yǔ)言的特色簡(jiǎn)潔、快速、平安、并行、有趣、開(kāi)源、支持泛型編程、內(nèi)存管理、數(shù)組平安、編譯迅速。目錄為什么我們需要Go語(yǔ)言1Go語(yǔ)言的簡(jiǎn)介2面向?qū)ο缶幊?Go語(yǔ)言語(yǔ)法312并發(fā)編程5Go語(yǔ)言的簡(jiǎn)介13Go語(yǔ)言簡(jiǎn)史Go語(yǔ)言是由貝爾實(shí)驗(yàn)室包括肯·湯普森在內(nèi)的Plan9原班人馬開(kāi)發(fā)。Go語(yǔ)言的第一個(gè)版本在2009年11月正式對(duì)外發(fā)布,并在此后的兩年內(nèi)快速迭代,開(kāi)展迅猛。第一個(gè)正式版本在2012年3月28正式發(fā)布。Go語(yǔ)言的簡(jiǎn)介14Go語(yǔ)言特性自動(dòng)垃圾回收更豐富的內(nèi)置類(lèi)型函數(shù)多返回值錯(cuò)誤處理匿名函數(shù)和閉包類(lèi)型和接口并發(fā)編程反射語(yǔ)言交互性目錄為什么我們需要Go語(yǔ)言1Go語(yǔ)言的簡(jiǎn)介2面向?qū)ο缶幊?Go語(yǔ)言語(yǔ)法315并發(fā)編程5包管理首字母大寫(xiě)是public,小寫(xiě)是private需要預(yù)先編譯才能import已有庫(kù)*nix/c標(biāo)準(zhǔn)庫(kù)-os,randC互操作-CContainer-heap,list,ring,vector,hashgolang的詞法/語(yǔ)法分析庫(kù)–ast網(wǎng)絡(luò)庫(kù)-websocket,,jsonGo語(yǔ)言語(yǔ)法17變量變量聲明varv1intvarv2stringvarv3[10]intvar(v1intv2string)變量初始化varv1int=10//okvarv2=10//okv3:=10//ok v2:=10//errorGo語(yǔ)言語(yǔ)法18變量變量賦值varv1intv1=123i,j=j,i//多重賦值,交換匿名變量funcGetName()(firstName,lastName,nickNamestring){return“May”,“Chan”,“ChibiMaruko”}_,_,nickName:=GetName()//僅獲取nickName,_為匿名變量占位符Go語(yǔ)言語(yǔ)法19常量字面常量常量定義預(yù)定義常量const( //iota重置為0 c0=iota//c0為0 c1=iota//c1為1 c2=iota//c2為2)枚舉const( Sunday=iota Monday numberDays//這個(gè)常量未導(dǎo)出)Go語(yǔ)言預(yù)定義了true,false,iotaGo語(yǔ)言語(yǔ)法20類(lèi)型根底類(lèi)型布爾類(lèi)型bool整型int8byteint16intuintuintptr浮點(diǎn)類(lèi)型float32float64復(fù)數(shù)類(lèi)型complex64complex128字符串string字符類(lèi)型rune錯(cuò)誤類(lèi)型error指針〔pointer〕數(shù)組〔array〕切片〔slice〕字典〔map〕通道〔chan〕結(jié)構(gòu)體〔struct〕接口〔interface〕復(fù)合類(lèi)型Go語(yǔ)言語(yǔ)法21流程控制條件語(yǔ)句ifa<5{return0}else{return1}選擇語(yǔ)句switchi{case0:fmt.Printf(“0”)case1:fallthroughcase2,3:fmt.Printf(“2,3”)default:fmt.Printf(“default”)}Go語(yǔ)言語(yǔ)法22流程控制選擇語(yǔ)句switch{case0<=Num&&Num<=3:fmt.Printf(“0-3”)case4<=Num&&Num<=6:fmt.Printf(“4-6”)}循環(huán)語(yǔ)句//case1sum:=0fori:=0;i<10;i++{//條件表達(dá)式中也支持多重賦值sum+=i}//case2sum:=0for{//相當(dāng)于while,do-whilesum++//支持按標(biāo)簽break}Go語(yǔ)言語(yǔ)法23流程控制跳轉(zhuǎn)語(yǔ)句支持continue、break、goto,break可按標(biāo)簽選擇中斷到哪一個(gè)循環(huán)Go語(yǔ)言語(yǔ)法24函數(shù)函數(shù)定義funcAdd(aint,bint)(retint,errerror){ifa<0||b<0{err=errors.New(“error”)return}returna+b,nil//多重返回值}匿名函數(shù)和閉包函數(shù)的根本組成為:關(guān)鍵字func、函數(shù)名、參數(shù)列表、返回值、函數(shù)體和返回語(yǔ)句。匿名函數(shù)由一個(gè)不帶函數(shù)名的函數(shù)聲明和函數(shù)體組成。匿名函數(shù)可以直接賦值給一個(gè)變量或直接執(zhí)行。閉包是可以包含自由變量的代碼塊。相當(dāng)于Java中的嵌套匿名類(lèi)Go語(yǔ)言語(yǔ)法25錯(cuò)誤處理大多數(shù)函數(shù)將error作為最后一個(gè)返回值deferfuncCopyFile(dst,srcstring)(wint64,errerror){srcFile,err:=os.Open(src)iferr!=nil{return}defersrcFile.Close()}//清理多語(yǔ)句,使用匿名函數(shù)deferfunc(){//清理工作}()defer語(yǔ)句的含義是不管程序是否出現(xiàn)異常,均在函數(shù)退出時(shí)自動(dòng)執(zhí)行相關(guān)代碼。目錄為什么我們需要Go語(yǔ)言1Go語(yǔ)言的簡(jiǎn)介2面向?qū)ο缶幊?Go語(yǔ)言語(yǔ)法326并發(fā)編程5面向?qū)ο缶幊?7類(lèi)型系統(tǒng)Go語(yǔ)言中的大多數(shù)類(lèi)型都是值語(yǔ)義,并且都可以包含對(duì)應(yīng)的操作方法。在需要的時(shí)候,你可以給任何類(lèi)型〔包括內(nèi)置類(lèi)型〕增加新方法。而在實(shí)現(xiàn)某個(gè)接口時(shí),無(wú)需從從該接口繼承,只需要實(shí)現(xiàn)該接口要求的所有方法即可。typeIntegerintfunc(aInteger)Less(bInteger)bool{returna<b}funcmain(){varaInteger=1ifa.Less(2){fmt.Println(a,“Less2”)}}面向?qū)ο缶幊?8可見(jiàn)性Go語(yǔ)言中要使某個(gè)符號(hào)對(duì)其他包〔package〕可見(jiàn),只需要將該符號(hào)定義為以大寫(xiě)字母開(kāi)頭,否那么不可見(jiàn)。成員方法和成員變量的可見(jiàn)性遵循同樣的規(guī)那么。Go語(yǔ)言中符號(hào)的可訪(fǎng)問(wèn)性是包一級(jí)的而不是類(lèi)型一級(jí)的。typeRectstruct{X,Yfloat64Width,Heightfloat64}func(r*Rect)area()float64{returnr.Width*r.Height}面向?qū)ο缶幊?9接口非侵入式接口typeFilestruct{//…}func(f*File)Read(buf[]byte)(nint,errerror)func(f*File)Write(buf[]byte)(nint,errerror)func(f*File)Close()error在Go語(yǔ)言中,一個(gè)類(lèi)只要實(shí)現(xiàn)了接口要求的所有函數(shù),我們就說(shuō)這個(gè)類(lèi)實(shí)現(xiàn)了該接口。這種方式有如下幾種好處:Go語(yǔ)言不需要繪制類(lèi)庫(kù)的繼承樹(shù)圖實(shí)現(xiàn)類(lèi)的時(shí)候,只需要關(guān)心自己應(yīng)該提供哪些方法,不用糾結(jié)接口需要拆的多細(xì)才適宜。不用為了實(shí)現(xiàn)一個(gè)接口而導(dǎo)入一個(gè)包,減少耦合。面向?qū)ο缶幊?0接口typeIFileinterface{Read(buf[]byte)(nint,errerror)Write(buf[]byte)(nint,errerror)Close()error}typeIReaderinterface{Read(buf[]byte)(nint,errerror)}typeIWriterinterface{Write(buf[]byte)(nint,errerror)}typeICloserinterface{Close()error}varfile1IFile=new(File)varfile2IReader=new(File)varfile3IWriter=new(File)varfile4ICloser=new(File)目錄為什么我們需要Go語(yǔ)言1Go語(yǔ)言的簡(jiǎn)介2面向?qū)ο缶幊?Go語(yǔ)言語(yǔ)法331并發(fā)編程5并發(fā)編程32協(xié)程Go語(yǔ)言在語(yǔ)言級(jí)別支持輕量級(jí)線(xiàn)程〔即協(xié)程〕,叫g(shù)oroutine。Go語(yǔ)言提供的所有系統(tǒng)調(diào)用操作都會(huì)出讓CPU給其他goroutine。這讓事情變得非常簡(jiǎn)單,讓輕量級(jí)線(xiàn)程的切換管理不依賴(lài)于系統(tǒng)的線(xiàn)程和進(jìn)程,也不依賴(lài)于CPU的核心數(shù)量。Go語(yǔ)言中最重要的一個(gè)特性是go關(guān)鍵字funcAdd(x,yint){z:=x+y}goAdd(2,1)//并發(fā)執(zhí)行并發(fā)編程33并發(fā)通信工程上兩種最常見(jiàn)的并發(fā)通信模型:共享數(shù)據(jù)消息一個(gè)大的系統(tǒng)中具有無(wú)數(shù)的鎖、無(wú)數(shù)的共享變量、無(wú)數(shù)的業(yè)務(wù)邏輯與錯(cuò)誤處理分支。采用共享數(shù)據(jù)將是一場(chǎng)噩夢(mèng)。Go語(yǔ)言已并發(fā)編程作為最核心優(yōu)勢(shì),提供了以消息機(jī)制而非共享內(nèi)存作為通信方式的通信模型〔channel〕。channel是類(lèi)型相關(guān)的的,一個(gè)channel只能傳遞一種類(lèi)型的值,這個(gè)類(lèi)型需要在聲明的channel時(shí)指定。channel相當(dāng)于一種類(lèi)型平安的管道。并發(fā)編程34并發(fā)通信channelselect{case<-chan1:casechan2<-1:default:}一般channel的聲明形式:varchanNamechanElementType定義一個(gè)channel:ch:=make(chanint)將一個(gè)數(shù)據(jù)寫(xiě)入channel:ch<-value從channel中讀取數(shù)據(jù):value:=<-chselectGo語(yǔ)言直接在語(yǔ)言級(jí)別支持select關(guān)鍵字,用于處理異步IO問(wèn)題。select有比較多的限制,其中最大的限制就是每個(gè)case語(yǔ)句里必須是一個(gè)IO操作。并發(fā)編程35并發(fā)通信緩沖機(jī)制timeout:=make(chanbool,1)gofunc(){time.Sleep(1e9)//等待1秒timeout<-true}()select{case<-ch:case<-timeout:default:}創(chuàng)立一個(gè)帶緩沖的channel:c:=make(chanint,1024)超時(shí)機(jī)制Go語(yǔ)言沒(méi)有提供直接的超時(shí)處理機(jī)制,但我們可以利用select機(jī)制實(shí)現(xiàn)一套并發(fā)編程36并發(fā)通信channel的傳遞typePipeDatastruct{valueinthandlerfunc(int)intnextchanint}funchandler(queuechan*PipeData){fordata:=rangequeue{data.next<-data.handler(data.value)}}Go語(yǔ)言中channel本身是一個(gè)原生類(lèi)型,因此channel可以傳遞。下面我們利用這個(gè)特性來(lái)實(shí)現(xiàn)*nix常見(jiàn)的管道特性并發(fā)編程37并發(fā)通信單向channel
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 肝硬化門(mén)脈高壓內(nèi)鏡止血個(gè)體化抗凝方案
- 肝硬化臨床思維模擬教學(xué)并發(fā)癥管理模擬
- 肝癌靶向索拉非尼與PD-1抑制劑聯(lián)用研究
- 公證課件底板尺寸大小
- 肝癌ICIs聯(lián)合靶向治療的轉(zhuǎn)化研究
- 深度解析(2026)《SYT 5127-2002井口裝置和采油樹(shù)規(guī)范》
- 聯(lián)合抗炎增效策略
- 2026年歷史學(xué)科高考復(fù)習(xí)精講精練試題
- 2026年智能機(jī)器人系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)方法測(cè)試題
- 2026年房地產(chǎn)營(yíng)銷(xiāo)策劃與管理題庫(kù)
- 量子科普知識(shí)
- 2025至2030中國(guó)航空安全行業(yè)市場(chǎng)深度研究與戰(zhàn)略咨詢(xún)分析報(bào)告
- 華潤(rùn)燃?xì)?026屆校園招聘“菁英計(jì)劃·管培生”全面開(kāi)啟備考考試題庫(kù)及答案解析
- 成本管理論文開(kāi)題報(bào)告
- 華潤(rùn)集團(tuán)6S管理
- 新建粉煤灰填埋場(chǎng)施工方案
- 2025年提高缺氧耐受力食品行業(yè)分析報(bào)告及未來(lái)發(fā)展趨勢(shì)預(yù)測(cè)
- 小學(xué)三年級(jí)數(shù)學(xué)判斷題100題帶答案
- 互聯(lián)網(wǎng)運(yùn)維服務(wù)保障承諾函8篇范文
- 電力三種人安全培訓(xùn)課件
- 電子科技大學(xué)自主招生人工智能自薦信范文
評(píng)論
0/150
提交評(píng)論