返回
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)
	}
}