func main() {
println("无参数无返回值函数")
myFunc1()
println("有参数无返回值")
myFunc2(2,2.9)
println("不定参数")
myFun3(1,2,3,4,5)
var a,b,c int
a = myFunc4(2,2)
println("----------",a)
b,c = myFunc5(2,2)
println("----------",b,c)
}
//无参数无返回值函数
func myFunc1() {
println("11111")
}
//有参数无返回值
func myFunc2(a int,b float32) {
fmt.Println(a,b)
}
//不定参数
func myFun3(a int,args...int) {
println("参数的个数",len(args))
for i,data :=range args{
println(i,data)
}
}
//有参数有一个返回值
func myFunc4(a int,b int)(result int) {
result = a + b
return result
}
//有参数有多个返回值
func myFunc5(a int,b int)(result1 int,result2 int) {
result1 = a + b
result2 = a - b
return result1,result2
}
//函数类型
//定义两个int参数,一个int返回值的函数类型,之后可以定义这个函数类型的变量
type MyFuncType func(int,int)(int)
func main() {
var myfunc MyFuncType
myfunc = add
var result int
result = myfunc(8,9)
println(result)
myfunc = jian
result = myfunc(8,9)
println(result)
}
func add(a,b int)(result int){
result = a+b
return result
}
func jian(a,b int)(result int){
result = a-b
return result
}
//回调函数
//多态(函数类型相同,但函数的实现不同),可以先定义,但是没有实现
type MyFuncType func(int,int)(int)
func main() {
var a int
a = MyFunc(1,2,add)
println(a)
a = MyFunc(1,2,jian)
println(a)
}
func MyFunc(a,b int,funcType MyFuncType)(result int) {
result = funcType(a,b)
return result
}
func add(a,b int)(result int){
result = a+b
return result
}
func jian(a,b int)(result int){
result = a-b
return result
}
匿名函数可以捕获同一级的其他变量,用来实现闭包
func main() {
var a = 10
f1 := func(){
println(a)
}
f1()
}
其实就是定义匿名函数后直接调用,闭包已引用方式捕获同级变量(会改变)
闭包只要还在使用变量,那么这个变量就存在,而不会被回收。
无参数无返回值的闭包
func main() {
var a = 10
func(){
println(a)
}()
}
有参数有返回值的闭包
func main() {
var a = 10
var b = 20
num := func(num1,num2 int)(result int){
result = num1 + num2
return result
}(a,b)
println(num)
}
在函数释放前执行,非正常释放(如崩溃)也会执行
多个defer先进后出
func main() {
var a = 10
var b = 20
num := func()(result int){
defer println("执行结束")
result = a + b
println("函数返回")
return result
}()
println(num)
}