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中有效 只能捕获到最后一个错误