配套正式課基礎(chǔ)篇_第1頁(yè)
配套正式課基礎(chǔ)篇_第2頁(yè)
配套正式課基礎(chǔ)篇_第3頁(yè)
配套正式課基礎(chǔ)篇_第4頁(yè)
配套正式課基礎(chǔ)篇_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

練識(shí)課堂--資深Go語(yǔ)言工程師實(shí)踐課第一Go語(yǔ)言介紹和練識(shí)課堂--資深Go語(yǔ)言工程師實(shí)踐課第一Go語(yǔ)言介紹和環(huán)境安Go語(yǔ)言官方介Go語(yǔ)言是有谷歌推出的一門編程語(yǔ)言Go是一個(gè)開(kāi)源的編程語(yǔ)言,它能讓構(gòu)造簡(jiǎn)單、可靠且高效的軟件變得容易Go語(yǔ)言主要開(kāi)發(fā)Go是從2007年末由RobertGriesemer,RobPike,KenThompson主持開(kāi)發(fā),后來(lái)還加入了IanLanceTaylor,RussCox等人,并最終于2009年11月開(kāi)源。Go語(yǔ)言的幾個(gè)里程2007.09Go語(yǔ)言設(shè)計(jì)草稿在白板上誕2008.01Ken開(kāi)發(fā)了Go語(yǔ)言編譯器把Go代碼編譯成C代2009Go語(yǔ)言誕2016.01Go1.5版本中實(shí)現(xiàn)了自舉,不再依賴C編譯2017.02Go1.8版本發(fā)布,大幅度提升GC效Go語(yǔ)言特并行、內(nèi)存管理、數(shù)組安全、編譯迅Go語(yǔ)言方高性能分布式系統(tǒng)領(lǐng)2Go語(yǔ)言的環(huán)境安裝oo語(yǔ)言中文網(wǎng)tl根據(jù)操作系統(tǒng)選擇對(duì)應(yīng)的安裝包2Go語(yǔ)言的環(huán)境安裝oo語(yǔ)言中文網(wǎng)tl根據(jù)操作系統(tǒng)選擇對(duì)應(yīng)的安裝包、、)。不要在安裝路徑中出現(xiàn)中文。Go語(yǔ)言開(kāi)發(fā)工具GoLandJetbrains家族的Go語(yǔ)言IDE,有30天的免費(fèi)試用期。根據(jù)操作系統(tǒng)選擇對(duì)應(yīng)的安裝包(Mac、Linux、Windows)下載對(duì)應(yīng)的軟件LiteIDE是一款開(kāi)源、跨平臺(tái)的輕Go語(yǔ)言集成開(kāi)發(fā)環(huán)境(IDE)。根據(jù)操作系統(tǒng)選擇對(duì)應(yīng)的安裝包(Linux、Windws)其他開(kāi)發(fā)工具(在IE安裝插件)第二章Go語(yǔ)言程1工作區(qū)是Go中的一個(gè)對(duì)應(yīng)于特定工程的目錄,其包括src,pkg,bin三個(gè)目c:用于以代碼包的形式組織并保存Go源碼文件。(比如:.go.c.h.等)pkg:用于存放經(jīng)由goinstall命令構(gòu)建安裝后的代碼包(包含Go庫(kù)源碼文件)的“”歸檔文件。n:與pkg目錄類似,在通過(guò)ol命令完成安裝后,保存由Go的可執(zhí)行文件。目錄c用于包含所有的源代碼,是Go命令行工具一個(gè)強(qiáng)制的規(guī)則,而pkg和手動(dòng)創(chuàng)建,如果必要Go命令行工具在構(gòu)建過(guò)程中會(huì)自動(dòng)創(chuàng)建這些目錄。只有當(dāng)環(huán)境變量GOPATH中只包含一個(gè)工作區(qū)的目錄路徑時(shí),goinstall命令才會(huì)把命令源碼安裝到當(dāng)前工作區(qū)的bin目錄下。若環(huán)境變量GOPATH中包含多個(gè)工作區(qū)的目錄路徑,像這樣執(zhí)行g(shù)oinstall命令就會(huì)失效,此時(shí)必須設(shè)置環(huán)境變量GOBIN。工作區(qū)如何設(shè)置(linuxmac版工作區(qū)設(shè)置路徑為環(huán)境變量中的goinstall:noinstalllocationfor.gofileslistedoncommandline(GOBINnotset)工作區(qū)如何設(shè)置(windows版工作區(qū)設(shè)置路徑為環(huán)境變量中的2Hello下面就用IDE工具,開(kāi)發(fā)第一工作區(qū)如何設(shè)置(windows版工作區(qū)設(shè)置路徑為環(huán)境變量中的2Hello下面就用IDE工具,開(kāi)發(fā)第一個(gè)GO程序Go語(yǔ)言源文件的擴(kuò)展是具體步3要執(zhí)行Go語(yǔ)言代碼可以使用命令或IDE來(lái)完成編譯命令如下編譯命令:gobuild編譯并運(yùn)行命令:gorun4go獲取對(duì)應(yīng)命令的幫助文檔,可以獲取到對(duì)應(yīng)命令的作用以及對(duì)應(yīng)參go獲取系統(tǒng)安裝go語(yǔ)言版本gogohelppackageimportfunc我的電腦--》右擊屬性-- 高級(jí)系統(tǒng)設(shè)置--》環(huán)境變量--》系統(tǒng)環(huán)境變量-》添加vim.bashrcexportGOROOT=$HOME/goexportPATH=$PATH:$GOPATH/bingobuild[-ooutput][-i][buildflags]-o參數(shù)決定了編譯后文件名稱,例如我們要程序main.go編譯后程序名為hello,我們-iinstall安裝作為目標(biāo)的依賴關(guān)系的包(用于增量編譯提速),gobuild[-ooutput][-i][buildflags]-o參數(shù)決定了編譯后文件名稱,例如我們要程序main.go編譯后程序名為hello,我們-iinstall安裝作為目標(biāo)的依賴關(guān)系的包(用于增量編譯提速),一般很少使用編譯參數(shù)一般并不會(huì)添加,以下列舉幾個(gè),詳細(xì)信息可以使用gohelpbuild獲交叉編Mac上編譯Linux可執(zhí)行二進(jìn)制文Mac上編譯Windows可執(zhí)行二進(jìn)制文Linux上編譯Mac可執(zhí)行二進(jìn)制文Linux上編譯Windows可執(zhí)行二進(jìn)制文Windows上編譯Mac可執(zhí)行二進(jìn)制文Windows上編譯Linux可執(zhí)行二進(jìn)制文SETCGO_ENABLED=0SETGOOS=darwinSETGOARCH=amd64gobuild附加參備-編譯時(shí)開(kāi)啟并發(fā)編譯,默認(rèn)情況下該值為CPU邏輯核-強(qiáng)制重新構(gòu)-打印編譯時(shí)會(huì)用到的所有命令,但不真正執(zhí)-打印編譯時(shí)會(huì)用到的gobuild-ohello交叉編譯參數(shù)含CGO_ENABLED是否使用cgo編譯,0為不使用,1為使用,使用cgo進(jìn)行交叉編譯時(shí)需交叉編譯參數(shù)含CGO_ENABLED是否使用cgo編譯,0為不使用,1為使用,使用cgo進(jìn)行交叉編譯時(shí)需S目標(biāo)操作系統(tǒng)標(biāo)識(shí),inws對(duì)應(yīng)Windws操作系統(tǒng)e可執(zhí)行文件,對(duì)應(yīng)Mac可執(zhí)行文件,liux對(duì)應(yīng)Linx可執(zhí)行文件,fed對(duì)應(yīng)IX系統(tǒng)RH目標(biāo)可執(zhí)行程序操作系統(tǒng)構(gòu)架,包括386,amd64,armgobuild后接所編譯程序的入口文go編譯并安裝項(xiàng)標(biāo)準(zhǔn)格goinstall[-i][buildflags]參數(shù)與用法與gobuild類go獲取go函數(shù)幫助文命令行形式獲取某個(gè)包的介紹以及包下所有可用的公共方法列g(shù)odoc命令行形式獲取某個(gè)方法的文godoc使用網(wǎng)頁(yè)形式查看幫助文godoc-在瀏覽器中輸入:http://localhost:6060/可以查看對(duì)應(yīng)的文檔信go查看當(dāng)前系統(tǒng)內(nèi)go相關(guān)的環(huán)境變量信goGo語(yǔ)言自帶的測(cè)試工具,會(huì)自動(dòng)讀取源碼目錄下面名為*_test.go的文件,生成并運(yùn)行測(cè)試原文件名必須是_test.go結(jié)尾的,這gotest的時(shí)候才會(huì)執(zhí)行到相應(yīng)的代碼必須importtesting這個(gè)包可執(zhí)行測(cè)原所有的測(cè)試用例函數(shù)必須是Test開(kāi)測(cè)試用例會(huì)按照源代碼中寫的順序測(cè)試函數(shù)TestXxx()的參testing.T,我們可以使用該類型來(lái)記錄錯(cuò)誤或者是SETCGO_ENABLED=0SETGOOS=linuxSETGOARCH=amd64gobuild測(cè)試格式funcTestXxx(t*testing.T)Xxx部分可以為任意的字母數(shù)字的組合,測(cè)試格式funcTestXxx(t*testing.T)Xxx部分可以為任意的字母數(shù)字的組合,試不通過(guò),調(diào)用Log方法用來(lái)記錄測(cè)試的信息。創(chuàng)建測(cè)試文件執(zhí)行命令行查看測(cè)試結(jié)gotest-v結(jié)===---PASS:TestHelloWorld(0.00s)class_test.go:10:command-line-arguments===RUNTestHelloWorld表示開(kāi)始運(yùn)行名叫TestHelloWorld的測(cè)試用---PASS:TestHelloWorld(0.00s)表示已經(jīng)運(yùn)行完TestHelloWorld的測(cè)試用例,PASS表示當(dāng)前方法測(cè)試成功,如果是FAIL表示當(dāng)前方法測(cè)試失敗,時(shí)間表示這個(gè)okcommand-line-aguments0.05s表示整體測(cè)試結(jié)果,ok表示所有被測(cè)試方法測(cè)試通過(guò),如果是IL則表示測(cè)試失敗,command-line-aguments用例需要用到的一個(gè)包名,0.005s表示測(cè)試花費(fèi)的時(shí)間。第三章關(guān)鍵packageg"){timestamp:=time.Now().Unix()}2定義變關(guān)鍵作一級(jí)分二級(jí)分三級(jí)分變量聲基本結(jié)變量與常-常量聲基本結(jié)變量與常-包聲基本結(jié)包管-包引基本結(jié)包管-函數(shù)聲基本組函-函數(shù)返基本組函-接基本組自定義類-結(jié)構(gòu)基本組自定義類-定義類基2定義變關(guān)鍵作一級(jí)分二級(jí)分三級(jí)分變量聲基本結(jié)變量與常-常量聲基本結(jié)變量與常-包聲基本結(jié)包管-包引基本結(jié)包管-函數(shù)聲基本組函-函數(shù)返基本組函-接基本組自定義類-結(jié)構(gòu)基本組自定義類-定義類基本組自定義類-基本組引用類-基本組引用類-流程控并-流程控并-流程控并-流程控單任務(wù)單分支流流程控單任務(wù)單分支流流程控單任務(wù)多分支流流程控單任務(wù)多分支流流程控單任務(wù)多分支流流程控單任務(wù)多分支流流程控單任務(wù)循環(huán)流流程控單任務(wù)循環(huán)流流程控單任務(wù)循環(huán)流流程控單任務(wù)-流程控延時(shí)流程控-varname1int64varname215//int類varname1int64varname215//int類name3:=15name4,name5,name6:="a","b","c"http://定義常量或常量packageimportconsta14func{varb=varc=int64(20)//int64d:=a+be:=a+c用于包聲明,在Go中包的概念一般指同一文件夾下的的文件,與其它部分語(yǔ)言每個(gè)文件可以自己就是一個(gè)包不同。包名可以與文件夾名稱不同,但是一般建議相同(如果文件夾帶有版本號(hào)情況可以忽略版本號(hào)部分)需要寫在程序的可執(zhí)行文件的第一行package用于包的引用,引用路徑為工作區(qū)下的相對(duì)路如果程序內(nèi)引用了兩個(gè)不同路徑下相同的包名,可以通過(guò)設(shè)定別名的方式進(jìn)行區(qū)package(_package(_)func}func定義函數(shù)接收返回函數(shù)方函數(shù)方packagefuncmain(){intArr:=}//有固定入?yún)ⅲ瑹o(wú)出funcdemo1(namestring){}//無(wú)固定入?yún)?,無(wú)出funcdemo2(namestring,64){}return}結(jié)構(gòu)體結(jié)構(gòu)體或者接口的聲接口,可以存放任意格式數(shù)據(jù),也可以定義接口方結(jié)構(gòu)一個(gè)被多種類型實(shí)現(xiàn)時(shí),需要區(qū)分的變量究竟存儲(chǔ)哪種類型的值packageimporttypedemoI}typedemoS1struct{}func(d*demoS1)funDemo1(string)int{return0}return""}funcmain()}funcdemo3(ddemoI){}funcdemo4()(age{}{return}{}go可以使用comma,ok的形式做區(qū)分value,ok:=em.(T):em是interfacego可以使用comma,ok的形式做區(qū)分value,ok:=em.(T):em是interface類型的變量T代表要斷言的類型,value是interface變量存儲(chǔ)的值,ok是bool類型表示是否為該斷言的類型T如果是按pointer調(diào)用,go會(huì)自動(dòng)進(jìn)行轉(zhuǎn)換,因?yàn)橛辛酥羔樋偸悄艿玫街羔樦赶虻娜绻莢alue調(diào)用,go將無(wú)從得知value的原始值是什么,因?yàn)関alue是份拷貝。go會(huì)把指針進(jìn)行隱式轉(zhuǎn)換得到value,但反過(guò)來(lái)則不行。map是Go內(nèi)置關(guān)聯(lián)數(shù)據(jù)類型(在一些其他的語(yǔ)言中稱為"哈希"或者"字典packagefuncmain()varm0map[string]intm1:=在nipanicvalue,h:=m0=make(map[string]int,100)//_,_,_=}與for配合,用于遍歷,可遍歷數(shù)組,map,string(string底層存儲(chǔ)為byte數(shù)組goroutine異步攜程,但是不建議攜程處理大文件,可以攜程來(lái)寫日志和處理高IO操作,如果Go中的一個(gè)控制結(jié)構(gòu),類似于用于通信的switch語(yǔ)句。每個(gè)case必須是一個(gè)通信操如果有同時(shí)多個(gè)case去處理,比如同時(shí)有多個(gè)channel可以接收數(shù)據(jù),那么Go會(huì)偽隨機(jī)的選擇一個(gè)case處理(pseud-andom)。如果沒(méi)有case需要處理,則會(huì)選擇dfat去處理,如果eutcase存在的情況下。如果沒(méi)有fatcase,則selet直到某個(gè)case需要處理。channel可以理解為一個(gè)先進(jìn)先出的消息隊(duì)列channel里面的valuebu?r的容量也就是channel的容量。chanl的容量為零表示這是一個(gè)阻塞型通道,非零表示緩沖型通道]。packagechanint64//nilmake(chanint64//無(wú)緩if/else/switch/case/default/流程if/else/switch/case/default/流程控制語(yǔ)循環(huán)控制語(yǔ)goto語(yǔ)句可以無(wú)條件地轉(zhuǎn)移到過(guò)程中指定的行通常與條件語(yǔ)句配合使用。可用來(lái)實(shí)現(xiàn)條件轉(zhuǎn)移,構(gòu)成循環(huán),跳出循環(huán)體在結(jié)構(gòu)化程序設(shè)計(jì)中一般不主張使用goto語(yǔ)句,以免造成程序流程的混亂gto對(duì)應(yīng)(標(biāo)簽)既可以定義在for循環(huán)前面,也可以定義在fr循環(huán)后面,當(dāng)跳轉(zhuǎn)到標(biāo)簽地方時(shí),繼續(xù)執(zhí)行標(biāo)簽下面的代碼。packageimportfuncmain()fmt.Println("日薪越億}第四章數(shù)據(jù)類數(shù)據(jù)類型表示數(shù)據(jù)在內(nèi)存中開(kāi)辟的空間大小的別稱在Go語(yǔ)言中數(shù)據(jù)類型可以分為:基本數(shù)據(jù)類型和派生數(shù)據(jù)類見(jiàn)名知小駝峰式命名法(lowercamel第一個(gè)單詞以小寫字母開(kāi)始,第二個(gè)單詞的首字母大寫,例如:myName、大駝峰式命名法(uprcamlcase):每一個(gè)單字的首字母都采用大寫字母,例如:FirstName、2Go語(yǔ)言數(shù)據(jù)類型分為五種類名零說(shuō)1其值不為真即為假,不可以用數(shù)字代表true字節(jié)10uint8別bool類型適用于邏輯運(yùn)算,一般用于流程控有符號(hào):int,int8,int16,int32,int64無(wú)符號(hào):uint,uint8,uint16,uint32,uint64,不同位數(shù)的整型區(qū)別在于能保存整型數(shù)字范圍的大有bool類型適用于邏輯運(yùn)算,一般用于流程控有符號(hào):int,int8,int16,int32,int64無(wú)符號(hào):uint,uint8,uint16,uint32,uint64,不同位數(shù)的整型區(qū)別在于能保存整型數(shù)字范圍的大有符號(hào)類型可以存儲(chǔ)任何整數(shù),無(wú)符號(hào)類型只能存儲(chǔ)自然fmt.Printf("%T"var_name)//輸出變量類十進(jìn)制整數(shù),使用0-9的數(shù)字表示且不以0開(kāi)八進(jìn)制整數(shù),以0開(kāi)頭,0-7的數(shù)字表十六進(jìn)制整數(shù),以0X或者是0x開(kāi)頭,0-9|A-F|a-f組尾數(shù)部分可能丟失,造成精度損float64的精度要比f(wàn)loat32的要準(zhǔn)名整長(zhǎng)零0說(shuō)根據(jù)操作系統(tǒng)設(shè)定數(shù)整10-128~整100~整20-32768~整200~整40-2147483648~整400~4294967295(42億整80-9223372036854775808整800~18446744073709551615(1844京浮點(diǎn)4小數(shù)位精確到7浮點(diǎn)8小數(shù)位精確到15字符-utf-8字符Golang中沒(méi)有專門的字符類型,如果要存儲(chǔ)單個(gè)字符(字母),一般使用yte字符只能被單引號(hào)包裹,不能用雙引號(hào),雙引號(hào)包裹的是字符串字符使用UTF-8編碼,Golang中沒(méi)有專門的字符類型,如果要存儲(chǔ)單個(gè)字符(字母),一般使用yte字符只能被單引號(hào)包裹,不能用雙引號(hào),雙引號(hào)包裹的是字符串字符使用UTF-8編碼,英文字母占一個(gè)字符,漢字占三個(gè)字可以直接給某個(gè)變量賦一個(gè)數(shù)字,然后按格式化輸出時(shí)%c,會(huì)輸出該數(shù)字對(duì)應(yīng)的unicode字符字符類型是可以運(yùn)算的,相當(dāng)于一個(gè)整數(shù),因?yàn)樗鼈兌加袑?duì)應(yīng)的unicodepackageimportfuncmain()varc1byte='z'varc2byte=fmt.Println(c1,"--",c2)fmt.Printf("c2=%cc2=%c,Theresultsof%d",c1,c2,c1-}但是如果我們保存的字符大于255,比如存儲(chǔ)漢字,這時(shí)byte類型就無(wú)法保存,可以使rune類型保字符串就是一串固定長(zhǎng)度的字符連接起來(lái)的字符序列。o的。Go語(yǔ)言的字符串的字節(jié)使用UTF-8編碼標(biāo)識(shí)Unicode文本雙引號(hào),會(huì)識(shí)別轉(zhuǎn)義字packageimportfuncmain()}packageimportfuncmain()packageimportfuncmain()}字符串拼接方式packageimportfuncmain()varstr="hello"+"world"str+="!"}當(dāng)一行字符串太長(zhǎng)時(shí),需要使用到多行字符串,可以使用如下處理,需要注意+必須在當(dāng)前packageimportfuncmain()varstr="hello"+str+="!"}3數(shù)據(jù)有不同的類型,不同類型數(shù)據(jù)之間進(jìn)行混合運(yùn)算時(shí)必然涉及到類型的轉(zhuǎn)兩種不同的類型在計(jì)算時(shí),Go語(yǔ)言要求必須進(jìn)行類型轉(zhuǎn)換類型轉(zhuǎn)換用于將一種數(shù)據(jù)類型的變量轉(zhuǎn)換為另外一種類型的變量Go語(yǔ)言類型轉(zhuǎn)換基本格式如下4數(shù)組:一組具有相同數(shù)據(jù)類型在內(nèi)存中有序存儲(chǔ)的數(shù)據(jù)集[5int全部為[5*int指針類int{1,2[5int全部為[5*int指針類int{1,2,3,4,5初始{1:14:5}初始化1,int//二維數(shù):=:=數(shù)組特長(zhǎng)度固定,不能修賦值和函數(shù)傳遞過(guò)程是值復(fù)制,涉slice聲明方copy,性能低slice數(shù)據(jù)結(jié)typeslicestructint//可用長(zhǎng)}計(jì)算方len:j-icapkik為s1的長(zhǎng)度slice=slice=底層基于Hash實(shí)現(xiàn),基于Key-Value,無(wú)序的dictmake(map[T_KEY]T_VALUE)key的類型需要具備操slice:=make([]int,5)函數(shù)類型、字典類型和切片類型不能作為key,不支持的操作函數(shù)類型、字典類型和切片類型不能作為key,不支持的操作類型會(huì)導(dǎo)致檢測(cè)值m:=if!h{}if_,h:=m["hello"];h}varmmap[string]int//nil類型,添加和修改會(huì)導(dǎo)致nil:len/map[key]/delete(m,key)//可以正常工map默認(rèn)并發(fā)不安全,多個(gè)goroutine寫同一個(gè)map,引發(fā)競(jìng)態(tài)錯(cuò)誤,gorun–race或gobuild-map對(duì)象即使刪除了全部的key,但不會(huì)縮容空可以使用運(yùn)算符&(取地址運(yùn)算符)來(lái)獲取數(shù)據(jù)的內(nèi)存地址variint=//%p是一個(gè)占位符輸出一個(gè)十六進(jìn)制地址格式fmt.Printf("%p\n",如果想將獲取的地址進(jìn)行保存,應(yīng)該怎樣做呢可以通過(guò)指針變量來(lái)存儲(chǔ),所謂的指針變量:就是用來(lái)存儲(chǔ)任何一個(gè)值的內(nèi)var指針變量名//默認(rèn)初始值為nil指向內(nèi)存地址編號(hào)為0的空var指針變量名*數(shù)據(jù)&變func{variint=//對(duì)變量取地址將結(jié)果賦值給指針變量varp*int=//打印指針變量p的值同時(shí)也是i指針變量,除了有正確指向,還可以通過(guò)new()函數(shù)來(lái)指向具體的應(yīng)用方式如下//new()函數(shù)的作用就是動(dòng)態(tài)分配空間,不//new()函數(shù)的作用就是動(dòng)態(tài)分配空間,不需要關(guān)心該空間的釋放,Go語(yǔ)言會(huì)自動(dòng)釋放{varp=new(int)*p=//打印地第五章流程控1if語(yǔ)在編程中實(shí)現(xiàn)選擇判斷結(jié)構(gòu)就是if結(jié)構(gòu)語(yǔ)條件判斷如果為真(rue),那么就執(zhí)行大括號(hào)中的語(yǔ)句;如果為假(false),中的語(yǔ)句。ifelse結(jié)構(gòu)if條件判斷}條件判斷如果為真(true),那么就執(zhí)行if大括號(hào)中的語(yǔ)句條件判斷如果為假(false),那么就執(zhí)行else大括號(hào)中的語(yǔ)句if代碼塊或else代碼塊,必須有一塊ifelseif結(jié)構(gòu)語(yǔ)if條件判斷}if條件判斷1}elseif條件判斷1}elseif條件判斷}elseif條件判斷}從上到下依次判斷條件,如果結(jié)果為真,就執(zhí)行{}內(nèi)的代碼switchswitch變量或者表達(dá)式的case值case值2:case值3:}執(zhí)行流程程序執(zhí)行到sth處,首先將變量或者表達(dá)式的值計(jì)算出來(lái),然后拿著這個(gè)值依次跟每個(gè)case后面所帶的值進(jìn)行匹配,一旦匹配成功,則執(zhí)行該case所帶的代碼,執(zhí)行完成后,跳出結(jié)構(gòu)。如果,跟每個(gè)case所帶的值都不匹配。就看當(dāng)前這個(gè)switch-cae結(jié)構(gòu)中是否存在defut有eat,則執(zhí)行dfut中的語(yǔ)句,如果沒(méi)有dfut,則該switch-ase結(jié)構(gòu)什么都不做。注意某個(gè)case后面跟著的代碼執(zhí)行完畢后,不會(huì)再執(zhí)行后面的case,而是跳出整個(gè)switch結(jié)構(gòu)但是如果想執(zhí)行完成某個(gè)case后,強(qiáng)制執(zhí)行后面的case,可以使用fallthrough2for語(yǔ)語(yǔ)法結(jié)}表達(dá)式1:定義一個(gè)循環(huán)的變量,記錄循環(huán)的次數(shù)表達(dá)式2:一般為循環(huán)條件,循環(huán)表達(dá)式3:一般為改變循環(huán)條件的代碼,使循環(huán)條件終有不再成立循環(huán)體:重復(fù)要做的事情示例packageimportfuncmain()sum:=fori:=示例packageimportfuncmain()sum:=fori:=1;i<=100;{sum+=}}示例packageimportfuncmain()//for100;i<=999;{i//%1010//十}i{}}循環(huán)語(yǔ)句之間可以相for循環(huán)條for循環(huán)條}break語(yǔ)在循環(huán)語(yǔ)句中可以使用break跳出語(yǔ)句continue語(yǔ)在循環(huán)語(yǔ)句中,如果希望立即終止本次循環(huán),并執(zhí)行下一次循環(huán),此時(shí)就需要使用coninue語(yǔ)句。第六章函數(shù)和閉1第六章函數(shù)和閉1在程序編譯完后,函數(shù)會(huì)以計(jì)算機(jī)指令方式存儲(chǔ)在代碼區(qū),在定義函數(shù)時(shí)指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元,函數(shù)的參數(shù)以及局部變量會(huì)在調(diào)用時(shí)加載到內(nèi)存中。棧(tac)是現(xiàn)代計(jì)算機(jī)程序里最為重要的概念之一,幾乎每一個(gè)程序都使用了棧,沒(méi)有棧就沒(méi)有函數(shù),沒(méi)有局部變量。棧被定義為一個(gè)特殊的容器,用戶可以將數(shù)據(jù)壓入棧中(入棧,push)彈出(出棧,pop),但是棧容器必須遵循一條規(guī)則:先入棧的數(shù)據(jù)最后出棧(FrtInLATOut,FI在經(jīng)典的操作系統(tǒng)中,棧總是向下增長(zhǎng)的。壓棧的操作使得棧頂?shù)牡刂窚p小,彈出操作使得棧頂?shù)刂吩龃蟆T诔绦蜻\(yùn)行中具有極其重要的地位。最重要的,棧保存一個(gè)函數(shù)調(diào)用所需要維護(hù)的信息,這通常被稱為堆棧幀(StackFam)或者活動(dòng)記錄(AtivteRcd).一個(gè)函數(shù)調(diào)用過(guò)程所需要的信息一般包括以下幾個(gè)方面:保存的上下文:包括在函數(shù)調(diào)用前后需要保持不變的寄存器2deferdefer語(yǔ)句被用于預(yù)定對(duì)一個(gè)函數(shù)的調(diào)用??梢园?deferdefer語(yǔ)句被用于預(yù)定對(duì)一個(gè)函數(shù)的調(diào)用??梢园堰@類被defer語(yǔ)句調(diào)用的函數(shù)稱為延遲函數(shù)defer作用funcdeferfmt.Println("性感法師")deferfmt.Println("在線教學(xué)")deferfmt.Println("日薪越億")deferfmt.Println("輕松就業(yè)")}{}結(jié)如果一個(gè)函數(shù)中有多個(gè)defer語(yǔ)句,它們會(huì)以LIFO(后進(jìn)先出)的順序執(zhí)行運(yùn)行時(shí)panic異常一旦被引發(fā)就會(huì)導(dǎo)致程序崩潰3funcrecover注意:recover只有在defer調(diào)用的函數(shù)中有效示例代packageimportfuncDemo(iint)vararr[10]intdeferfunc(){err:=recover()//產(chǎn)生panic異常打印錯(cuò)誤信iferr!={結(jié)runtimeerror:indexoutof如果程序沒(méi)有異常,不會(huì)打印結(jié)runtimeerror:indexoutof如果程序沒(méi)有異常,不會(huì)打印錯(cuò)誤信息4Go語(yǔ)言支持匿名函數(shù),可作為閉包。匿名函數(shù)是一個(gè)"內(nèi)聯(lián)"語(yǔ)句或表達(dá)式。匿名函數(shù)的優(yōu)越性在以下實(shí)例中,創(chuàng)建了函數(shù)getSequence(),返回另外一個(gè)函數(shù)。該函數(shù)的目的是在閉包中遞增ipackageimport{{return}}funcnextNumber為一個(gè)函數(shù),函數(shù)i為0:=調(diào)用f1函數(shù),i變量自增1并返回}//如果i的值超過(guò)數(shù)組下標(biāo)arr[i]=}funcmain()//產(chǎn)生錯(cuò)誤后程序繼}/*創(chuàng)建新的f2,并查看結(jié)果*/f2:=getSequence()/*創(chuàng)建新的f2,并查看結(jié)果*/f2:=getSequence()}結(jié)果12312注意由于閉包會(huì)使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會(huì)造成網(wǎng)頁(yè)的性能問(wèn)題,在IE中可能導(dǎo)致內(nèi)存泄露。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。閉包會(huì)在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。所以,如果你把父函數(shù)當(dāng)作對(duì)象(t)使用,把閉包當(dāng)作它的公用方法(PublicMthod),把內(nèi)部變量當(dāng)作它的私有屬性(pivatee),這時(shí)一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值。第七章結(jié)構(gòu)體和匿名字 語(yǔ)言中數(shù)組切片可以存儲(chǔ)同一類型的數(shù)據(jù),但在結(jié)構(gòu)體中可以為不同項(xiàng)定義不同的數(shù)結(jié)構(gòu)體是由一系列具有不同類型的數(shù)據(jù)構(gòu)成的數(shù)type結(jié)構(gòu)體名struct結(jié)構(gòu)體成員名數(shù)據(jù)類型結(jié)構(gòu)體成員名數(shù)據(jù)類型結(jié)構(gòu)體成員名數(shù)據(jù)類型}注意:結(jié)構(gòu)體成員在定義時(shí)不能賦值1o語(yǔ)言中的strt是一種很重要的語(yǔ)法,里面可以存放各種字段,當(dāng)然它里面也可以為空。這樣可以用來(lái)單純的做控制信息。a:=struct{}{}結(jié)果由于空結(jié)構(gòu)體占用0字節(jié),那么空結(jié)構(gòu)體也不需要填充字節(jié)。所以空結(jié)構(gòu)體組成的組合數(shù)據(jù)類型也不會(huì)占用內(nèi)存空間。typeS{Astruct{}Bstruct{}}varsStypeS{Astruct{}Bstruct{}}varsS結(jié)果:有一種特殊的}類型的channl,它不能被寫入任何數(shù)據(jù),只有通過(guò)close()作,才能進(jìn)行輸出操作。}類型的channl不占用任何內(nèi)存。定義varsig=make(chan使用空struct是對(duì)內(nèi)存更友好的開(kāi)發(fā)方式,在go源代碼中針對(duì)空struct類數(shù)據(jù)內(nèi)存申請(qǐng)部分,2結(jié)構(gòu)體的tag設(shè)}People{tag是類型的一部分,主要用于通過(guò)反射獲取字段的相關(guān)tag設(shè)typeOfCat:=reflect.TypeOf(People{})fori:=0;i<typeOfCat.NumField();i++{field:=typeOfCat.Field(i)tag:=field.Tag.Get("json")}3可以通過(guò)匿名字段實(shí)現(xiàn)“繼承關(guān)系”,所謂的匿名字段就是將結(jié)構(gòu)體名稱作為另外結(jié)構(gòu)體{NamestringAgeuint}typeStudentstruct//將結(jié)構(gòu)體名稱作為另外結(jié)構(gòu)體的成員}繼承后,子類可以直接使用父類的結(jié)構(gòu)體成員1值對(duì)象接收f(shuō)unc(pPeople)GetName()stringreturnp.Name}{1值對(duì)象接收f(shuō)unc(pPeople)GetName()stringreturnp.Name}{調(diào)用時(shí)會(huì)按照其一個(gè)副本來(lái)執(zhí)行調(diào)指針對(duì)func

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論