六、使用函数

小例子:

package main

import (
    
    "fmt"

)

// 参数,返回值
func getsum(arr []int) int {


    sum := 0


    for elem := range arr {


    sum += elem

}

return sum

}

 

func main() {


    var a = []int{1, 2, 3, 4, 5}


    var b = []int{3, 2, 3, 1, 6, 4, 8, 9}


    fmt.Println(getsum(a))


    fmt.Println(getsum(b))

}

 

函数格式:

func 函数名 (参数) 返回值类型 {

    函数体

}

实参和虚参:

和大多数语言一样,实参就是在全局或者局部创建的变量,虚参就是用来做占位符的。

 

返回多个参数的函数:

package main

 

import (

    "fmt"

)

 

func getsum(arr []int) (sum int, avr float64) {

    sum = 0

    avr = 0.0

    for _, elem := range arr {

        sum += elem

    }

    avr = float64(sum) / float64(len(arr))

    // return sum, avr  // 两种方式

    return

}

 

func main() {

    var arr = []int{1, 2, 3, 4, 5}

    fmt.Println(getsum(arr))

}

变长参数的函数:

格式

package main

 

import (

    "fmt"

)

 

// 注意变长参数只能是最后一个参数

func getsum(arr ...int) (sum int) {

    sum = 0

    for _, elem := range arr {

        sum += elem

    }

    return sum

}

 

func main() {

    fmt.Println(getsum(1, 2, 3))

}

 

闭包函数:

以前没接触过的新概念,就是讲整个函数赋值给一个变量。

package main

 

import (

    "fmt"

)

 

func main() {

    sum := func(arr ...int) (res int) {

        res = 0

        for _, elem := range arr {

            res += elem

        }

        return res

    }

    fmt.Println(sum(1, 2, 3))

}

闭包对于外层函数的变量具有访问和修改的权利。

例如:

package main

 

import (

    "fmt"

)

 

func main() {


    base := 2


    sum := func(arr ...int) (res int) {

        res = 0

        for _, elem := range arr {


            res += elem


        }


        // 这里的base是外层main函数中的变量


        base += 4


        return res / base

    }


    fmt.Println(sum(1, 2, 3))

}

递归函数:

没有什么难点。

package main

 

import (

    "fmt"

)

 

func feibo(x int) (res int) {

    // 天哪这个地方不加花括号会报错的

    if x == 0 {

        res = 0

    } else if x <= 2 {

        res = 1

    } else {

        res = feibo(x-1) + feibo(x-2)

    }

    return res

}

 

func main() {

    for i := 0; i <= 10; i++ {

        fmt.Println(feibo(i))

    }

}

异常处理:

package main


import (

    "fmt"

)

 

func first() {

    fmt.Println("this is first func")

}

 

func second() {

    fmt.Println("this is second func")

}

 

func main() {

    /*

     Golang语言提供defer关键字用来在函数运行结束的时候运行一段代码

     或者调用一个清理函数。类似finally

    */

    defer first()

    second()

    // 虽然顺序上first()函数是先运行的

    // 但是first()函数用defer关键字修饰,所以main函数结束后才运行first()函数

}

panic & recover:

正如词意:异常,回滚

panic用来触发异常,而recover用来终止异常并且传递给panic的值

注意!!!:

recover只能配合defer使用。

例子:

package main

 

import (

    "fmt"

)

 

func main() {

    defer func() {

        msg := recover()

        fmt.Println(msg)

    }()

    fmt.Println("It's ok")

    panic("There are exception")

    /*

     这里是不会输出recover捕捉到的异常信息的,因为panic哪里出现了异常就停止了程序

     所以说recover必须配合defer使用

     msg := recover()

     fmt.Println(msg)

    */

}
原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/9053474.html