函数


1、函数的定义

packagemainimport"fmt"funcadd(aint,bint)int{//当函数参数类型相同时,除最后一个外其他类型可省略。//add(aint,bint)==add(a,bint)returna+b}funcmain(){fmt.Println(add(1,2))}//执行结果:#gorunfunc.go3

2、函数的多返回值

packagemainimport"fmt"funcadd(a,bint)(int,int){returna+b,a-b}funcmain(){fmt.Println(add(1,2))}//执行结果:3-1

3、函数的匿名返回值

packagemainimport"fmt"funcadd(a,bint)(x,yint){x=a+by=a-breturn//返回值定义返回x,y因此return后面可省略}funcmain(){fmt.Println(add(1,2))}

4、函数不定长参数

packagemainimport"fmt"funcadd(a,bint)(x,yint){x=a+by=a-breturn}funcsum(args...int)int{//参数为slicefinal:=0for_,value:=rangeargs{//当遍历时索引信息不需要可以用"_"来代替.final+=value}returnfinal}funcmain(){fmt.Println(add(1,2))fmt.Println(sum(1,2,3,4,5,6))}//执行结果:3-121

5、函数嵌套函数

packagemainimport"fmt"funcadd(a,bint)int{num:=1sub:=func()int{num-=1returnnum}fmt.Println(sub())returna+b}funcmain(){fmt.Println(add(1,2))}//执行结果:03


6、内置函数

1、close:主要用于关闭channel2、len用来求长度,比如string\array\slice\map\channel3、new用来分配内存,主要用来分配值类型比如intstruct返回的是指针4、make用来分配内存主要用于分配引用类型比如mapchanslice5、append用来追加元素到数组slice中6、panic和recover用来做错误处理


7、递归函数

函数自己调用自己叫做递归packagemainimport"fmt"import"time"test(){fmt.Println("hello")time.Sleep(time.Second)}funcmain(){test()}#执行结果:hellohellohellohellohellohellohello...



defer


1、defer可以在函数执行体都执行完后在执行

多个defer遵循先进后出

packagemainimport"fmt"funcclean(){fmt.Println("dosomethinginclean")}funcmain(){deferclean()fmt.Println("endmain")}//执行结果:endmaindosomethinginclean


recover

1、当程序出错时,可以通过recover来捕捉

packagemainimport"fmt"funcsafeDivision(a,bint)int{deferfunc(){fmt.Println(recover())}()v:=a/breturnv}funcmain(){safeDivision(1,0)fmt.Println("endmain")}//执行结果:runtimeerror:integerdividebyzeroendmain

panic

1、可以通过panic来抛出异常,通过recover来捕捉

packagemainimport"fmt"funcdemPanic(){deferfunc(){fmt.Println(recover())}()panic("PANIC")}funcmain(){demPanic()fmt.Println("endmain")}//执行结果:PANICendmain