Go语言 函数基本特性
package main
import "fmt"
func main() {
//可变参数
func1(1,2,3,4,5)//[]int,5
num:=[]int{1,2,3,4,5}
func1(num...)//[]int,5
//参数传递 值传递和引用传递
func2(num)
fmt.Println(num) //[100 2 3 4 5]
//多个返回值
fmt.Println(func3(2,3))
//函数类型
fmt.Printf("%T\n", func1) //func(...int)
fmt.Printf("%T\n", func2) //func([]int)
fmt.Printf("%T\n", func3) //func(int, int) (int, int)
//变量直接调用函数(函数赋值给变量) 因为函数本身就是一种复合数据类型 特殊的变量
fmt.Println(func1) //0x49fed0
f:=func1
f(1,2,3,4,5) //[]int,5
//匿名函数 可直接调用 当赋值给一个变量可调用多次 作用:将匿名函数作为参数使用,回调函数 ,也可以做返回值
f2:= func() {
fmt.Println("我是一个匿名函数")
}
f2() //我是一个匿名函数
//回调函数
fmt.Println(func4(3, 4, func3)) //3 4
//闭包
/*
一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量(外层函数中的参数,或者外层函数中直接定义的变量),并且该外层函数的返回值就是这个内层函数
这个内层函数和外层函数的局部变量,统称为闭包结构
局部变量的生命周期会发生改变,正常的局部变量随着函数调用而创建,随着函数的结束而销毁
但是闭包结构中的外层函数的局部变量并不会随着外层函数的结束而销毁,因为内层函数还要继续使用
*/
fun2:=func5()
fmt.Println(fun2()) //1
fmt.Println(fun2()) //2
//指针函数 即返回的是一个地址而不是一个值,然后用一个指针来接收
a:=func6()
fmt.Printf("a的类型为%T,a的值为%p,地址为%p,数值为%v\n",a,a,&a,*a) //a的类型为*[]int,a的值为0xc000004580,地址为0xc000006030,数值为[1 2 3 4]
//指针作为参数
x:=2
fmt.Printf("x=%d\n",x) //2
func7(&x)
fmt.Printf("x=%d\n",x) //200
/*
defer的词义:"延迟",推迟
在go语言中,使用defer关键字来延迟一个函数或者方法的执行
1.defer函数或方法:一个函数或方法的执行被延迟了
2.defer的用法
A: 对象.close(),临时文件的删除...
文件.open()
defer close()
读或写
B:go语言中关于异常的处理,使用panic() 和recover()
panic函数用于引发恐慌,导致程序中断执行
recover函数用于恢复程序的执行,recover()语法上要求必须在defer中执行
3.如果多个defer函数:先延迟的后执行,后延迟的先执行 堆栈方式
4.defer函数传递参数的时候:defer函数调用是,就已经传递了参数数据了,只是暂时不执行函数中的代码而已
5.defer函数注意点:
1.当外围函数中的语句正常执行完毕时,只有其中所有的延迟函数都执行完毕,外围函数才会真正的结束执行
2.当执行外围函数中的return语句时,只有其中所有的延迟函数都执行完毕后,外围函数才会真正返回
3.当外围函数中的代码引发运行恐慌时,只有其中所有的延迟函数都执行完毕后,该运行时恐慌才会真正被扩展至调用函数
*/
}
func func1(num ... int) {
fmt.Printf("%T,%d\n",num,len(num))
}
func func2(num []int) {
num[0]=100
fmt.Println(num) //[100 2 3 4 5]
}
func func3(x int, y int)(int,int) {
return x,y
}
func func4(x,y int, fun func(int,int) (int,int)) (int,int) {
return fun(x,y)
}
func func5() (func() int) {
x:=0
fun:=func () int{
x++
return x
}
return fun
}
func func6() *[]int {
arr:=[]int{1,2,3,4}
fmt.Printf("arr的地址为:%p\n",&arr) //arr的地址为:0xc000004580
return &arr
}
func func7(x *int){
*x=200
}