函數(shù)、函數(shù)調(diào)用、不定參數(shù)、多返回值、延遲調(diào)用_第1頁
函數(shù)、函數(shù)調(diào)用、不定參數(shù)、多返回值、延遲調(diào)用_第2頁
函數(shù)、函數(shù)調(diào)用、不定參數(shù)、多返回值、延遲調(diào)用_第3頁
函數(shù)、函數(shù)調(diào)用、不定參數(shù)、多返回值、延遲調(diào)用_第4頁
函數(shù)、函數(shù)調(diào)用、不定參數(shù)、多返回值、延遲調(diào)用_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

函數(shù)定義201874日11:18Gofuncfuncfunction_name[parameterlist[return_types函數(shù)體}函數(shù)定義解析:func:函數(shù)由func開頭聲明function_name:函數(shù)名稱,函數(shù)名和參數(shù)列表一起構(gòu)成了函數(shù)簽名。parameterlist:參數(shù)列表,參數(shù)就像一個(gè)占位符,當(dāng)函數(shù)被調(diào)用時(shí),你可以將值傳遞給參數(shù),這個(gè)值被稱為實(shí)際參數(shù)。參數(shù)列表指定的是參數(shù)類型、挨次、及參數(shù)個(gè)數(shù)。參數(shù)是可選的,也就是說函數(shù)也可以不包含參數(shù)。return_types:返回類型,函數(shù)返回一列值。return_typesreturn_types函數(shù)體:函數(shù)定義的代碼集合。funcplusPlus(a,funcplusPlus(a,b,cint)int{returna+b+c}例如:/**/funcmax(num1,/**/funcmax(num1,num2int)int{/**/varresultintif(num1>num2){result=num1}else{result=num2}returnresult}函數(shù)調(diào)用201879日16:47packagemainimportpackagemainimport“fmt“funcmain{/**/varaint=100varbint200varretint/**/ret=max(a,b)fmt.Printf(“maxNum=:%d\n“,ret)}/**/funcmax(num1,num2int)int{/**/varresultintif(num1>num2){result=num1}else{result=num2}returnresult}200200不定參數(shù)201879日16:48Cprintf函數(shù),從那個(gè)時(shí)候開頭其實(shí)已經(jīng)在感受不定參數(shù)的魅力和價(jià)值。如同Cprintf函數(shù),Gofmt.Println等函數(shù)的實(shí)現(xiàn)也嚴(yán)峻依靠于語言的不定參數(shù)功能。不定參數(shù)類型不定參數(shù)是指函數(shù)傳入的參數(shù)個(gè)數(shù)為不定數(shù)量。為了做到這點(diǎn),首先需要將函數(shù)定義為承受不定參數(shù)類型:funcfuncmyfunc(){forfor_,arg:=rangeargs{fmt.Println(arg)fmt.Println(arg)}}}這段代碼的意思是,函數(shù)myfunc承受不定數(shù)量的參數(shù),這些參數(shù)的類型全部是int,所以它可以用如下方式調(diào)用:myfunc(2,myfunc(2,3,4)myfunc(1,3,myfunc(1,3,7,13)argsfor假設(shè)沒有...typefuncfuncmyfunc2(args[]int){forfor_,arg:=rangeargs{fmt.Println(arg)fmt.Println(arg)}}}從函數(shù)的實(shí)現(xiàn)角度來看,這沒有任何影響,該怎么寫就怎么寫。但從調(diào)用方來說,情形則完全不同:myfunc2([]int{1,3,myfunc2([]int{1,3,7,13}…)不定參數(shù)的傳遞myfunc3(args...int),下面的例子演示了如何向其傳遞變參:funcfuncmyfunc(){////按原樣傳遞myfunc3(args...)myfunc3(args...)////傳遞片段,實(shí)際上任意的intslice都可以傳進(jìn)去myfunc3(args[1:]...)myfunc3(args[1:]...)}任意類型的不定參數(shù)int,假設(shè)你期望傳任意類型,可以指定類型interface{Gofmt.Printf的函數(shù)原型:funcfuncPrintf(formatstring,erface{}){////...}interface{}Gointerface{}仍舊是類型安全的,這和C/C+interface{}類型的數(shù)據(jù)。packagepackagemainimportimport“fmt“funcfuncMyPrintf(erface{}){forfor_,arg:=rangeargs{switchswitcharg.(type){casecaseint:fmt.Println(arg,fmt.Println(arg,“isanintvalue.“)casecasestring:fmt.Println(arg,fmt.Println(arg,“isastringvalue.“)casecaseint64:fmt.Println(arg,fmt.Println(arg,“isanint64value.“)default:default:fmt.Println(arg,fmt.Println(arg,“isanunknowntype.“)}}}}funcmainfuncmain{varvarv1int=1varvarv2int64=234varvarv3string=“hello“varvarv4float32=1.234MyPrintf(v1,MyPrintf(v1,v2,v3,v4)}該程序的輸出結(jié)果為:11isanintvalue.234234isanint64value.hellohelloisastringvalue.1.2341.234isanunknowntype.多返回值201879日16:48C、C+JavaGo方法可以有多個(gè)返回值,這個(gè)特性能夠使我們寫出比其他語言更優(yōu)雅、更簡(jiǎn)潔的代碼,F(xiàn)ile.Read函數(shù)就可以同時(shí)返回讀取的字節(jié)數(shù)和錯(cuò)誤信息。假設(shè)讀取文件成功,則返回值中的nerrnilerrfunc(file*File)func(file*File)Read(b[]byte)(nint,errError)packagemainimportpackagemainimport“fmt“funcswap(x,ystring)(string,string){returny,x}funcmain{a,b:=swap(“Mahesh“,“Kumar“)fmt.Println(a,b)}n,n,_:=f.Read(buf)實(shí)例:以上實(shí)例執(zhí)行結(jié)果為:以上實(shí)例執(zhí)行結(jié)果為:KumarMahesh匿名函數(shù)與閉包201879日16:49匿名函數(shù)GoC類似。不同的是,Go匿名函數(shù)由一個(gè)不帶函數(shù)名的函數(shù)聲明和函數(shù)體組成,如下所示:func(a,func(a,bint,zfloat64)bool{returnreturna*b<int(z)}匿名函數(shù)可以直接賦值給一個(gè)變量或者直接執(zhí)行:returnreturnx+yf:=func(x,yint)int{}yy:=20x:=10fmt.Println(fmt.Println(“和f(xy))閉包Go*根本概念閉包是可以包含自由〔未綁定到特定對(duì)象〕變量的代碼塊,這些變量不在這個(gè)代碼塊內(nèi)或者任何全局上下文中定義,而是在定義代碼塊的環(huán)境中定義。要執(zhí)行的代碼塊〔由于自由變量包含在代碼塊中,所以這些自由變量以及它們引用的對(duì)象沒有被釋放〕為自由變量供給綁定的計(jì)算環(huán)境〔作用域〕。*閉包的價(jià)值閉包的價(jià)值在于可以作為函數(shù)對(duì)象或者匿名函數(shù),對(duì)于類型系統(tǒng)而言,這意味著不僅要表示數(shù)據(jù)還要表示代碼。支持閉包的多數(shù)語言都將函數(shù)作為第一級(jí)對(duì)象,就是說這些函數(shù)可以存儲(chǔ)到變量中作為參數(shù)傳遞給其他函數(shù),最重要的是能夠被函數(shù)動(dòng)態(tài)創(chuàng)立和返回。*GoGo語言中的閉包同樣也會(huì)引用到函數(shù)外的變量。閉包的實(shí)現(xiàn)確保只要閉包還被使用,packagepackagemainimportimport(“fmt““fmt“funcmainfuncmain{varvarjint=5aa:=func(func){varvariint=10returnreturnfunc{fmt.Printf(“i,fmt.Printf(“i,j:%d,%d\n“,i,j)}}}}aajj*=2aa}上述例子的執(zhí)行結(jié)果是:i,i,j:10,5i,i,j:10,10在上面的例子中,變量a指向的閉包函數(shù)引用了局部變量ij,i在閉包外不能被修改,轉(zhuǎn)變j的值以后,再次調(diào)用a,覺察結(jié)果是修改正的值。a指向的閉包函數(shù)中,只有內(nèi)部的匿名函數(shù)才能訪問變量i,而無法通過其他途徑訪問到,因此保證了i延遲調(diào)用201879日16:49(1).deferdeferdeferfuncfuncmain{fmt.Println(“thisfmt.Println(“thisisatest”)完畢前調(diào)用/*/*運(yùn)行結(jié)果:運(yùn)行結(jié)果:ThisThisisatestThisThisisadefer*/*/}defer語句常常被用于處理成對(duì)的操作,如翻開,關(guān)閉,連接,斷開連接,加鎖,deferdefer(2)deferdeferLIFO(后進(jìn)先出)的挨次執(zhí)行。哪怕函數(shù)或者某個(gè)延遲調(diào)用發(fā)生錯(cuò)誤,這些調(diào)用照舊會(huì)執(zhí)行。funcfunctest(xint){funcmain{funcmain{deferdeferfmt.Println(“aaaaa”)deferdeferfmt.Println(“bbbbb”)deferdefertest(0)deferdeferfmt.Println(“ccccc”)/*/*ccccc運(yùn)行結(jié)果:ccccc運(yùn)行結(jié)果:bbbbbbbbbbaaaaaaaaaa*/*/}(3).deferfuncfuncmain{a,b:=10,20x,x,b)//b閉包引用}(a)}(a)aa+=10bb+=100fmt.Println(fmt.Println(“a=%d,b=%d\n“,a,b)/*/*運(yùn)行結(jié)果:運(yùn)行結(jié)果:aa=20,b=120defer:defer:10,120*/*/}獵取命令行參數(shù)201879日16:50(1).ospackagepackagemainimportimport(“fmt““fmt““os““os“)funcfuncmain{fmt.Println(os.Args)fmt.Println(os.Args)}(2).flagpackagepackagemain“flag“import“flag“import(“fmt““fmt“)funcfuncmain{okok:=flag.Bool(“ok“,false,“isok“)idid:=flag.Int(“id“,0,“id“)portport:=flag.String(“port“,“:8080“,“l(fā)istenport“)varvarnamestringflag.StringVar(&name,flag.StringVar(&name,“name“,“123“,“name“)flag.Parseflag.Parsefmt.Println(“ok:“,fmt.Println(“ok:“,*ok)fmt.Println(“id:“,fmt.Println(“id:“,*id)fmt.Println(“port:“,fmt.Println(“port:“,*port)fmt.Println(“name:“,fmt.Println(“name:“,name)}flag.Int、flag.Bool、flag.String示參數(shù)名稱,其次個(gè)參數(shù)表示默認(rèn)值,第三個(gè)參數(shù)表示使用說明和描述。flag.StringVarflag.String一樣的。(局部變量,全局變量)201879日16:50(1).局部變量在函數(shù)體內(nèi)聲明的變量稱之為局部變量,它們的作用域只在函數(shù)體內(nèi),參數(shù)和返回值變量也是局部變量。packagemainimport“fmt“funcmainpackagemainimport“fmt“funcmain{/**/varabcint/**/a10b=20c=a+bfmt.Printfa%dbdandc%d\n“abc)}以上實(shí)例執(zhí)行輸出結(jié)果為:結(jié)果:a=10,b=20andc=30(2).全局變量在函數(shù)體外聲明的變量稱之為全局變量,全局變量可以在整個(gè)包甚至外部包〔被導(dǎo)出后〕使用。全局變量可以在任何函數(shù)中使用,以下實(shí)例演示了如何使用全局變量:packagepackagemainimport“fmt“/**/vargintfuncmain{/**/varabint/**/a10b=20g=a+bfmt.Printf(a%dbdandg%d\n“abg)}以上實(shí)例執(zhí)行輸出結(jié)果為:a10b20andg30遞歸函數(shù)201879日16:51遞歸指函數(shù)可以直接或間接的調(diào)用自身。遞歸函數(shù)通常有一樣的構(gòu)造:一個(gè)跳出條件和一個(gè)遞歸條件。所謂跳出條件就是依據(jù)傳入的參數(shù)推斷是否需要停頓遞歸,而遞歸體則是函數(shù)自身所做的一些處理。遞歸是算法中特別是樹、圖等構(gòu)造中常用的方法,理解遞歸的運(yùn)行原理是寫出高效代碼的關(guān)鍵。針對(duì)效率要求比較高的場(chǎng)景,可以嘗試寫出非遞歸的版本。總體上而言,遞歸寫法的代碼體積小、易維護(hù),非遞歸寫法代碼維護(hù)稍顯困難,但執(zhí)行效率相對(duì)較高。//1+2+3…+100funcadd1inti:=0sum:=0fori=1;i<=100;i++{sum+=i}returnsum}//1+2+3…+100funcadd2(numintintifnum==1{returnnum}returnnum+add2(num-1)}1://1,1,2,3,5//1,1,2,3,5npackagemainImport“fmt“funcgetNum(nint)int{Ifn==1||n==2{return1}returngetNum(n-1)+getNum(n-2)}funcmain{nu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論