這篇文章主要介紹golang中函數(shù)怎么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了貴德免費(fèi)建站歡迎大家使用!
函數(shù)是組織好的,可重復(fù)利用的、用于執(zhí)行指定任務(wù)的代碼塊。
go語言中支持函數(shù)、匿名函數(shù)和閉包,并且函數(shù)在go語言中屬于“一等公民”。
go語言中使用func關(guān)鍵字定義函數(shù),具體格式如下:
func 函數(shù)名(參數(shù)) (返回值){ 函數(shù)體 }
其中,
函數(shù)名由字母、數(shù)字、下劃線組成,但是函數(shù)名的第一個(gè)字母不能是數(shù)字,在同一個(gè)包內(nèi),函數(shù)名也不能重名。
參數(shù):參數(shù)由參數(shù)變量和參數(shù)變量的類型組成,多個(gè)參數(shù)之間使用,分隔。
返回值:返回值由返回值變量和其變量類型組成,也可以只寫返回值的類型,多個(gè)返回值必須用()包裹,并用,分隔。
函數(shù)體:實(shí)現(xiàn)指定功能的代碼塊
我們先來定義一個(gè)求兩個(gè)數(shù)之和的函數(shù)
func sumint(x int, y int) int { return x+y }
函數(shù)的參數(shù)和返回值都是可選的,例如我們可以實(shí)現(xiàn)一個(gè)既不需要參數(shù)也沒有返回值的函數(shù):
func sayHello() { fmt.Println("Hello 沙河") }
定義了函數(shù)后,我們通過 函數(shù)名()
的方式來調(diào)用函數(shù),例如我們調(diào)用上面定義的函數(shù):
func main() { sayHello() ret := intSum(10, 20) fmt.Println(ret) }
注意,調(diào)用有返回值的函數(shù)時(shí),可以不接收其返回值。
函數(shù)的參數(shù)中,如果相鄰變量的類型相同,可以省略類型,如下:
func intSum(x, y int) int { return x + y }
上面的代碼,函數(shù)有兩個(gè)參數(shù),這兩個(gè)參數(shù)的類型均為int,因此可以省略x的類型,因?yàn)閥后面有類型說明,x參數(shù)也是該類型。
可變參數(shù)是指函數(shù)的參數(shù)數(shù)量不固定,Go語言中的可變參數(shù),通過在參數(shù)名后面加...來標(biāo)識。
注意:可變參數(shù)通常作為函數(shù)的最后一個(gè)參數(shù)。
舉個(gè)例子:
func intSum2(x ...int) int { fmt.Println(x) //x是一個(gè)切片 sum := 0 for _, v := range x { sum = sum + v } return sum }
go語言中通過return關(guān)鍵字向外輸出函數(shù)的返回值。
go語言中的函數(shù)支持多個(gè)返回值,并在函數(shù)體中直接使用這些變量,最后通過return 關(guān)鍵詞返回。
func calc(x, y int) (sum, sub int) { sum = x + y sub = x - y return }
由于go語句中的延遲調(diào)研的特性,所以defer語句能非常方便的處理資源釋放問題,比如:資源清理、文件關(guān)閉、解鎖及記錄時(shí)間等。
在Go語言的函數(shù)中return語句在底層并不是原子操作,它分為給返回值賦值和RET指令兩步。而defer語句執(zhí)行的時(shí)機(jī)就在返回值賦值操作后,RET指令執(zhí)行前。具體如下圖所示:
func f1() int { x := 5 defer func() { x++ }() return x } func f2() (x int) { defer func() { x++ }() return 5 } func f3() (y int) { x := 5 defer func() { x++ }() return x } func f4() (x int) { defer func(x int) { x++ }(x) return 5 } func main() { fmt.Println(f1()) fmt.Println(f2()) fmt.Println(f3()) fmt.Println(f4()) }
全局變量是定義在函數(shù)外的變量,它在程序整個(gè)運(yùn)行周期內(nèi)都有效。在函數(shù)中可以訪問到全局變量。
package main import ( "fmt" ) var num int = 10 func testGlobal(){ fmt.Printf("num =%d\n", num) } func main(){ testGlobal() }
局部變量又分為兩種:函數(shù)內(nèi)定義的變量無法再該函數(shù)外使用,例如下面的示例代碼main函數(shù)中無法使用testLocalvar函數(shù)中定義的變量x:
package main import ( "fmt" ) func testLocalvar(){ var x int = 100 fmt.Printf("x=%d\n",x) } func main(){ testLocalvar() fmt.Println(x) }
如果局部變量和全局變量重名,優(yōu)先訪問局部變量:
package main import ( "fmt" ) var num int = 100 func testNum(){ num := 100 fmt.Printf("num=%d\n",num) } func main(){ testNum() //num =100 }
接下來我們來看一下語句塊定義的變量,通常我們會(huì)在if條件判斷、for循環(huán)、switch語句上使用這種定義變量的方式。
package main import ( "fmt" ) func testLocalvar(x,y int){ fmt.Println(x,y) if x > 0 { z := 100 fmt.Println(z) } fmt.Println(z) //此處無法使用變量i } func main(){ testLocalvar(1,2) //num =100 }
函數(shù)可以作為變量進(jìn)行傳遞:
func main() { f1 := add //將函數(shù)add賦值給變量f1 fmt.Printf("type of f1:%T\n", f1) //type of f1:func(int, int) int ret := f1(10, 20) fmt.Println(ret) }
func add(x, y int) int {
return x + y
}
func calc(x, y int, op func(int, int) int) int {
return op(x, y)
}
func main() {
ret2 := calc(10, 20, add)
fmt.Println(ret2) //30
}
函數(shù)還可以作為返回值,但是在Go語言中函數(shù)內(nèi)部不能再像之前那樣定義函數(shù)了,只能定義匿名函數(shù),匿名函數(shù)就是沒有函數(shù)名的函數(shù),匿名函數(shù)的定義格式如下:
func(參數(shù))(返回值){ 函數(shù)體 }
匿名函數(shù)因?yàn)闆]有函數(shù)名,所以沒辦法像普通函數(shù)那樣調(diào)用,所有匿名函數(shù)需要保存到某個(gè)變量或者作為立即執(zhí)行函數(shù):
package main import ( "fmt" ) func main(){ add := func(x,y int){ fmt.Println(x+y) } add(10,20) func(x,y int){ fmt.Println(x+y) }(10,20) }
閉包指的是一個(gè)函數(shù)和與其相關(guān)引用環(huán)境組合而成的實(shí)體。簡單的說,閉包=函數(shù)+引用環(huán)境。首先我們看一個(gè)實(shí)例:
func adder() func(int) int { var x int return func(y int) int { x += y return x } } func main() { var f = adder() fmt.Println(f(10)) //10 fmt.Println(f(20)) //30 fmt.Println(f(30)) //60 f1 := adder() fmt.Println(f1(40)) //40 fmt.Println(f1(50)) //90 }
以上是“golang中函數(shù)怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文標(biāo)題:golang中函數(shù)怎么用
本文URL:http://aaarwkj.com/article42/pesphc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、微信公眾號、網(wǎng)站收錄、網(wǎng)站改版、靜態(tài)網(wǎng)站、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(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)