每天5分钟-玩转golang,第3节 函数

234 阅读2分钟

1. 定义和调用

  • 函数包括 函数名 行参列表 函数体和返回值列表
    • 行参列表和返回值列表 都需要定义类型
func function_name(parameters) returns {
	body
}

无参 无返回值

func sayhello(){
	fmt.Println("Hello World!")
}

有参 无返回值

func sayhello(name string){
	fmt.Println("Hello World!", name)
}

有参 有返回值

func get_info(name string) int{
	config_name := map[string]int{"panpan": 18, "lijiaqi": 35}

	age, status := config_name[name]

	if status{
		return age
	}else{
		return -1
	}
}

2.参数合并

  • 在声明函数中 存在多个连续 相同的形参, 可以只保留最后一个参数的类型
    • func function(name1, name2, name3 string){}

3.返回值

  • 多返回值
func calc(n1,n2 int)(int, int, int){
	return n1-n2. n1+n2, n1/n2
}
  • 命名返回值
func calc(n1, n2 int)(count, diff int){
	count := n1 + n2
	diff := n1 - n2
    return
}

4 闭包

  • 在函数内的 匿名函数 引用外部函数的变量, 只要匿名函数继续使用 外部函数赋值的变量不被自动销毁

func addBase(base int) func (int) int{
    return func(num int) int{
    	return base + int
    }
}

5 值类型&引用类型

  • 值类型: 在赋值新变量之后 新变量变化了 不影响原来的变量, 内存地址不一样

    • 数值、布尔、字符串、指针、数组、结构体
  • 引用类型: 在赋值新变量之后 新变量变化了 影响原来的变量 内存地址不一杨 但是底层共享数据

    • 切片、映射、接口

6 值传递和引用传递

7.defer

  • 不论函数是否发生错误 都会在return之前执行
  • 如果defer声明多个函数 则按照声明的顺序(堆栈) 先进后出, 先声明的后执行
  • 常用于释放资源 记录日志
func defercase1(){

	fmt.Println("start")
	defer func() {
		fmt.Println("defer 01")
	}()

	defer func() {
		fmt.Println("defer 02")
	}()

	defer func() {
		fmt.Println("defer 03")
	}()

	fmt.Println("over")

}

output:
[root@happy go]# go run defercase.go 
start
over
defer 03
defer 02
defer 01

8 panic recover

  • 当调用panic抛出错误 中断原有的控制流程 常用于不可修复性的错误
  • recover用于 终止错误, 截取错误处理流程 仅在defer中有效 只能捕获到最后一个错误