go学习之函数

go中函数定义用func

func 函数名(参数)(返回值){
    函数体
}


说明:
函数名:在同一个包内,函数名也称不能重名
参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。
返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用()包裹,并用,分隔。

牢记函数的标准格式,其他简写都是有标准格式而来 例如: func f(x int, y int) (i int) { a :
= x + 1 b := y + 1 i = a + b //变量i int已存在,无需再次声明 return i // 等价于:return }

 

参数类型相同可以简写

func f(x, y int) int {
    return x + y
}
可变参数:可变参数通过在参数名后加...来标识,一般是最后一个参数

func f(x ...int) int {
    fmt.Println(x) //x是一个切片
    sum := 0
    for _, v := range x {
        sum = sum + v
    }
    return sum
}
函数多返回值:函数定义时有多个返回值时必须用()将所有返回值包裹起来

func f(x, y int) (int, int) {
    a := x + y
    b := x - y
    return a, b
}

返回值命名,函数定义时可以为返回值命名,函数体中只需要一个return就行

func f(x, y int) (sum int) {
	sum = x + y
	
	return
}


变量作用域

全局变量:定义在函数外部的变量,它在程序整个运行周期内都有效。 在函数中可以访问到全局变量
局部变量:
1、函数内:函数内定义的变量无法在该函数外使用,局部变量和全局变量重名,优先访问局部变量。
2、if条件判断、for循环、switch语句上使用这种定义变量:此变量只在该语句块中生效,语句块之外无法使用该变量

 

高阶函数

高阶函数指函数可以作为变量或者返回值

例如:

func add(x, y int) int {
	return x + y
}
//2个int类型参数,一个func类型参数(该func接收2个int参数,且返回值为int) 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 }

 

匿名函数

在go语言中,在函数内不能在定义标准类型的函数,但是可以使用匿名函数

匿名函数格式如下:
func(参数)(返回值){
    函数体
}

因为匿名函数没有名字,不能像普通函数一样调用,匿名函数需要保存到某个变量或者作为立即执行函数

例如:
func main() {
    // 将匿名函数保存到变量
    add := func(x, y int) {
        fmt.Println(x + y)
    }
    add(10, 20) // 通过变量调用匿名函数

    //自执行函数:匿名函数定义完加()直接执行
    func(x, y int) {
        fmt.Println(x + y)
    }(10, 20)
}

 

defer语句

defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。

在Go语言的函数中return语句在底层并不是原子操作,它分为给返回值赋值和RET指令两步。而defer语句执行的时机就在返回值赋值操作后,RET指令执行前

 

posted @ 2021-08-16 20:05  泉love水  阅读(35)  评论(0编辑  收藏  举报