Go程序设计语言读书笔记-第五章

第五章-函数

实参是按值传递的,搜易函数收到的每个实参的副本。如果提供实参包含引用类型,比如指针、slice、map、函数或者通道,那么函当函数使用形参变量时就有可能会间接地修改实参变量。

Go可以使用递归。Go语言的实现使用了可变长的栈,栈的大小会随着使用而增长,可达到1GB左右的上限。这使我们可以安全地使用递归而不用担心溢出的问题。

多返回值,一个函数能够返回不止一个结果。

一个函数如果有命名的返回值,可以省略return的操作数,成为裸返回。

匿名函数:只能在包级别的作用于声明,但我们能够使用函数字面量在任何表达式内指定函数变量。func关键字后面没有函数的名称。

func squares()func()int{
	var x int   //x=0
	return func()int{
		x++
		return x * x
	}
}

func main(){
	f := squares() //"1"
	fmt.Printf(f())  //"4"
	fmt.Printf(f())  //"9"
	fmt.Printf(f())  //"16"
}

函数squares返回了另一个函数,类型是func()int。函数变量不仅是一段代码还可以拥有状态。里层的匿名函数能够获取和更新外层squares函数的局部变量。

变长函数被调用的时候可以有可变的参数个数。在参数列表最后的类型名称之前使用省略号“...”表示声明一个变长函数,调用这个函数的时候可以传递该类型任意数目的参数。

func sum(vals ..int)int{
	total := 0
	for _,val := range vals{
		total += val
	}
	return total
}

fmt.Println(sum())  //“0”
fmt.Println(sum(3)) //"3"
fmt.Println(sum(1,2,3,4))  //"10"

values := []int{1,2,3,4}
fmt.Println(sum(values...))  //"10"

上面这个sum函数返回零个或者多个int参数。在函数体内,vals是一个int类型的slice。调用sum的时候任何数量的参数都将提供给vals参数。

延迟函数:一个defer语句就是一个普通的函数后准方法调用。

defer详解链接:https://blog.csdn.net/Rage_/article/details/87936192

猜你喜欢

转载自blog.csdn.net/Rage_/article/details/89310821