溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

golang中函數(shù)怎么用

發(fā)布時(shí)間:2021-10-21 13:50:58 來(lái)源:億速云 閱讀:128 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹golang中函數(shù)怎么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

函數(shù)是組織好的,可重復(fù)利用的、用于執(zhí)行指定任務(wù)的代碼塊。
go語(yǔ)言中支持函數(shù)、匿名函數(shù)和閉包,并且函數(shù)在go語(yǔ)言中屬于“一等公民”。

函數(shù)定義

go語(yǔ)言中使用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)指定功能的代碼塊

我們先來(lái)定義一個(gè)求兩個(gè)數(shù)之和的函數(shù)

func sumint(x int, y int) int {
     return x+y
}

函數(shù)的參數(shù)和返回值都是可選的,例如我們可以實(shí)現(xiàn)一個(gè)既不需要參數(shù)也沒(méi)有返回值的函數(shù):

func sayHello() {
    fmt.Println("Hello 沙河")
}

函數(shù)的調(diào)用

定義了函數(shù)后,我們通過(guò) 函數(shù)名() 的方式來(lái)調(diào)用函數(shù),例如我們調(diào)用上面定義的函數(shù):

func main() {
    sayHello()
    ret := intSum(10, 20)
    fmt.Println(ret)
}

注意,調(diào)用有返回值的函數(shù)時(shí),可以不接收其返回值。

參數(shù)

類型簡(jiǎn)寫

函數(shù)的參數(shù)中,如果相鄰變量的類型相同,可以省略類型,如下:

func intSum(x, y int) int {
    return x + y
}

上面的代碼,函數(shù)有兩個(gè)參數(shù),這兩個(gè)參數(shù)的類型均為int,因此可以省略x的類型,因?yàn)閥后面有類型說(shuō)明,x參數(shù)也是該類型。

可變參數(shù)

可變參數(shù)是指函數(shù)的參數(shù)數(shù)量不固定,Go語(yǔ)言中的可變參數(shù),通過(guò)在參數(shù)名后面加...來(lái)標(biāo)識(shí)。
注意:可變參數(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語(yǔ)言中通過(guò)return關(guān)鍵字向外輸出函數(shù)的返回值。

多返回值

go語(yǔ)言中的函數(shù)支持多個(gè)返回值,并在函數(shù)體中直接使用這些變量,最后通過(guò)return 關(guān)鍵詞返回。

func calc(x, y int) (sum, sub int) {
    sum = x + y
    sub = x - y
    return
}

defer語(yǔ)句

由于go語(yǔ)句中的延遲調(diào)研的特性,所以defer語(yǔ)句能非常方便的處理資源釋放問(wèn)題,比如:資源清理、文件關(guān)閉、解鎖及記錄時(shí)間等。

defer 的執(zhí)行時(shí)機(jī)和案例分析

在Go語(yǔ)言的函數(shù)中return語(yǔ)句在底層并不是原子操作,它分為給返回值賦值和RET指令兩步。而defer語(yǔ)句執(zhí)行的時(shí)機(jī)就在返回值賦值操作后,RET指令執(zhí)行前。具體如下圖所示:

golang中函數(shù)怎么用

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ù)進(jìn)階

變量作用域

全局變量

全局變量是定義在函數(shù)外的變量,它在程序整個(gè)運(yùn)行周期內(nèi)都有效。在函數(shù)中可以訪問(wèn)到全局變量。

package main
import (
    "fmt"
)
var num int = 10
func testGlobal(){
    fmt.Printf("num =%d\n", num)
}
func main(){
    testGlobal()
}
局部變量

局部變量又分為兩種:函數(shù)內(nèi)定義的變量無(wú)法再該函數(shù)外使用,例如下面的示例代碼main函數(shù)中無(wú)法使用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)先訪問(wèn)局部變量:

package main
import (
    "fmt"
)
var num int = 100
func testNum(){
    num := 100
    fmt.Printf("num=%d\n",num)

}
func main(){
    testNum() //num =100
}

接下來(lái)我們來(lái)看一下語(yǔ)句塊定義的變量,通常我們會(huì)在if條件判斷、for循環(huán)、switch語(yǔ)句上使用這種定義變量的方式。

package main
import (
    "fmt"
)
func testLocalvar(x,y int){
    fmt.Println(x,y)
    if x > 0 {
        z := 100
        fmt.Println(z)
    }
    fmt.Println(z) //此處無(wú)法使用變量i

}
func main(){
    testLocalvar(1,2) //num =100
}
函數(shù)作為變量

函數(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)
}
函數(shù)可以作為參數(shù)

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ù)

函數(shù)還可以作為返回值,但是在Go語(yǔ)言中函數(shù)內(nèi)部不能再像之前那樣定義函數(shù)了,只能定義匿名函數(shù),匿名函數(shù)就是沒(méi)有函數(shù)名的函數(shù),匿名函數(shù)的定義格式如下:

func(參數(shù))(返回值){
    函數(shù)體
}

匿名函數(shù)因?yàn)闆](méi)有函數(shù)名,所以沒(méi)辦法像普通函數(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í)體。簡(jiǎn)單的說(shuō),閉包=函數(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)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI