老雷go语言视频教程之Go语言的函数func
老雷go语言视频教程之函数func
一、函数定义
func add(a int,b int) int { return int }
func: 函数声明
add: 函数名称
(a int,b int):函数参数
int:返回类型
二、函数调用
m:=add(1,2)
三、函数参数
函数参数可分按 值传递、引用传递
1、值传递:最常用
func add(a int,b int)
2、引用传递,可改变外部变量
func add2(a *int)
var m=1;
add2(&m);
3、可变参数:...type
func min(p ...int)
4、使用函数作为参数
函数:需要完整的声明
func callback(i int, f func(int, int) int) int { return f(i, 2) }
四、函数返回值
函数返回: return
命名的返回值: (m int,b int)
func add3(a int,b int) (m int,n int){ m=a+b n=a*b return }
多返回参数:
m,n=add3(1,2)
空白符:_ 忽略返回值
m,_=add3(1,2)
五、defer 延时到函数返回之前执行
func d(){
defer fmt.Print("defer")
fmt.Print("defer before")
}
六、递归函数
当一个函数在其函数体内调用自身,则称之为递归
func for3(a int) { if a > 3 { fmt.Print(a) a-- for3(a) } }
七、闭包,匿名函
闭包:没有名字的函数,通常是临时内部调用
func(x int, y int) int { return x + y }
直接执行闭包:结尾()调用
func (x int){}(1)
a(1)
闭包可以赋值给变量
g :=func(int a){}
作为函数返回:
func refun(a int) func(b int) { return func(b int) { fmt.Print(a + b) } }
课后作业:
写一个函数实现a,b两个人的石头剪刀布游戏
a=石头,b=布
func ganme(a,b){
return 谁赢了
}
package main import ( "fmt" ) func main() { m := add(1, 2) var i = 1 add2(&i) n := callback(2, add) c, d := add3(1, 2) z := min(8, 5, 4, 2) fmt.Print(m, i, n, c, d, z) defer2() for3(10) fn1() fn2() //函数作为返回值 re1 := refun(5) re1(2) } func add(a int, b int) int { return a + b } func add2(m *int) { *m++ } func callback(i int, f func(int, int) int) int { return f(i, 2) } func add3(a int, b int) (m int, n int) { m = a + b n = a * b return } func min(p ...int) int { if len(p) == 0 { return 0 } min := p[0] for _, v := range p { if v < min { min = v } } return min } func defer2() { defer fmt.Print("defer") fmt.Print("defer before") } func for3(a int) { if a > 3 { fmt.Print(a) a-- for3(a) } } func fn1() (ret int) { defer func() { ret++ }() return 1 } func fn2() { g := func(a int) { fmt.Printf("%d 除 3= %d", a, a%3) } for i := 0; i < 5; i++ { g(i) } } func refun(a int) func(b int) { return func(b int) { fmt.Print(a + b) } }