Go语言编程基础:函数

99 阅读2分钟
func 函数名(参数列表) (返回值列表) {
    执行语句...
    return 返回值列表
}
在Go中,函数可以返回多个值。

在函数的传值中,值类型变量传的是自己的副本,引用类型变量传的是地址的副本。

每个源文件可以都包含一个init函数,该函数会在main函数之前执行。
所以我们可以在init函数中进行一些初始化的工作
func init() {
    //....
}

普通函数:
例1:
    func add(a int, b int) int {
        return a + b
    }
    func addSub(a int, b int) (int, int) {
        return a + b, a - b
    }
    func addSub1(a int, b int) (add int, sub int) {
        add = a + b
        sub = a - b
        return
    }
    
把函数作为参数的函数
例1:
    func print( func addSub(a int, b int)(int, int) ) {
        fmt.Println( addSub(a, b) )
    }

把函数作为返回值的函数
    func gogo() func (int, int) int {
	return func (a int, b int) int { return a + b }
    }
    gogo()(1, 2)

函数闭包
例1:
    package main

    import (
	"fmt"
	"strings"
    )

    //检查字符串后缀名是否符合要求
    func makeSuffix(suffix string) func (string) string {

            return func (name string) string {
                    if !strings.HasSuffix(name, suffix) {
                            return name + suffix
                    }

                    return name
            }
    }

    func main() {
            checkSuffix := makeSuffix(".jpg") //起个别名
            fmt.Println(checkSuffix("tp"))
            fmt.Println(checkSuffix("ho.jpg"))
    }
    
延迟函数
在Go中函数的结束发生在函数返回之后
defer用来修饰函数(方法)调用
而被defer修饰的语句,将执行在函数返回之后,函数结束之前。
如果多条语句被defer修饰,那么按"先入后出"的方式依次执行。
    func m(a *int) int {
        defer fmt.Println("hello")
        return a
    }

内置函数
    len()用来求长度
    cap()用来求容量
    new()用来分配内存(主要是值类型)
    make()用来分配内存(主要是引用类型)
    
错误处理
当程序发生错误的时候,会抛出一个panic的异常,然后程序崩溃。
错误处理就是希望当程序抛出一个panic的异常时,我们能捕获它并处理,
保持程序正常运行。
例1:
    package main

    import "fmt"

    func main() {
            defer func() {
                    err := recover() //内置函数,能够捕获异常
                    if err != nil {
                            fmt.Println("err=", err)
                    }
            }()
            num1 := 10
            num2 := 0
            res := num1 / num2
            fmt.Println("res =", res)
    }
    
例2:
    package main

    import (
            "errors"
            "fmt"
    )

    func readConf(name string) error {
            if name == "config.ini" {
                    return nil //表示没有错误
            }else {
                    return errors.New("wrong") //自定义一个错误
            }
    }
    func main() {
            err := readConf("config2.ini")
            if err != nil {
                    panic(err) //抛出异常,程序结束
            }
            fmt.Println("hello")
    }