golang-15- 函数高级特性


1、匿名函数就是没有名字的函数,它以函数字面量的方式在行内进行声明。

拥有同样的函数签名形式,同样拥有参数列表和返回值

<code>import ("fmt""math")func main(){/* 声明函数变量 */getSquareRoot := func(x float64) float64 {return math.Sqrt(x)}/* 使用函数 */fmt.Println(getSquareRoot(9)) //结果为 3}/<code>


2、Go 语言可以很灵活的创建函数,并作为另外一个函数的实参,也就是说匿名函数可以直接赋给一个变量。

我们在定义的函数中初始化一个变量,该函数仅仅是为了使用内置函数 math.sqrt()

<code>func adder() func(int) int {sum := 0return func(x int) int {sum += xreturn sum}}func main() { ////函数adder返回一个闭包。每个闭包都被绑定到其各自的sum变量上pos, neg := adder(), adder()for i := 0; i < 10; i++ {fmt.Println(pos(i),neg(-2*i),)}}// 0 0// 1 -2// 3 -6// 6 -12// 10 -20// 15 -30// 21 -42// 28 -56// 36 -72// 45 -90// /<code>

3、函数的闭包

Go 函数可以是闭包的。闭包是一个函数值,它来自函数体的外部的变量引用。 函数可以对这个引用值进行访问和赋值;换句话说这个函数被“绑定”在这个变量上。

<code>func adder() func(int) int {sum := 0return func(x int) int {sum += xreturn sum}}func main() { ////函数adder返回一个闭包。每个闭包都被绑定到其各自的sum变量上pos, neg := adder(), adder()for i := 0; i < 10; i++ {fmt.Println(pos(i),neg(-2*i),)}}// 0 0 解析 pos(0)中 0+0=0 neg(0)中 0+0=0// 1 -2 解析 pos(1)中 0+1=1 neg(1)中 0+-2=-2// 3 -6 解析 pos(2)中 1+2=3 neg(2)中 -2+-4=-6// 6 -12 解析 pos(3)中 3+3=6 neg(3)中 -6+--6=--12// 10 -20// 15 -30// 21 -42// 28 -56// 36 -72// 45 -90/<code>

4、如果一个函数需要传入若干不确定个数的参数,就可以使用"..."的方式来表达这若干个参数

<code>func test(args ...string){ fmt.Printf("%T", args) //打印类型是数组}/<code>