函数能减少重复的代码。它就像机器,接收输入,经过内部的处理后,返回结果。
使用func
关键字声明一个函数。创建一个求和函数sum
当多个参数类型一样时,可以省略前面参数的类型:
函数可以有多个返回值,我们来写一个求商和余数的函数:
dividend
是除数, divisor
是被除数
该函数有两个类型相同的返回值,函数调用者并不知道返回的值分别对应哪个。这时候,命名返回值就派上用场了。
quotient
是商, remainder
是余数。
命名返回值已经是初始化好的变量,初始值是对应类型的零值。注意quotient = dividend / divisor
是赋值操作,而不是声明新变量。
quotient
,remainder
已经被赋值了,可以省略return
语句后面的变量,直接返回。
但不建议这样做,这样会降低可读性, 推荐使用前一种方式。
函数该怎么取名?
把自己代入函数调用者的视角,你希望看到函数名时就能大概知道这个函数的作用。取名时要遵循这个原则,同时兼顾简洁。
上面的sum
函数只能求两个数的和。如何求一组数的和呢?
在参数的类型前加...
,sum
就可以传人任意数量的int
的变量。nums
就是int
类型的切片,通过切片来实现可变参数。
输出
可变参数必须排在最后
例如,这样写是错误的
报错:
考考你,为什么可变参数必须排在最后?
函数是一等公民,意味着函数和其他数据类型(如整型、字符串等)一样。你可以把函数赋值给变量、作为参数传递给其他函数,或者作为函数的返回值。
你可以像创建变量一样来创建一个函数:
等价于
sum
是一个变量,它的类型是func(a int, b int) int
。func(a int, b int) int
又叫函数签名。只要是接收两个int
类型,返回一个int
类型的函数都可以赋值给sum
变量:
输出
匿名函数
没有名字的函数就叫匿名函数,例如定义函数时直接运行:
输出
函数是引用类型,它的零值是nil
:
输出
输出
函数就是值,可以像其他类型一样传递给其他函数。
输出
每调用一次c()
, n
就递增1。
什么是闭包函数
闭包就是函数里引用了外部的变量,例如c
是一个闭包函数,引用了外部变量n
。
n
是在makeCounter()
函数里创建的,是c
的外部变量。
输出
你可以发现,函数类型的变量永远占8个字节的内存(64位系统)。很好理解,函数是引用类型,它本质上就是个指针,指向实际的函数。