Go语言入门6-函数function

函数function

  • Go 函数 不支持 嵌套、重载和默认参数,但支持以下特性:

无需声明原型、不定长度变参(…)、多返回值、命名返回值参数
匿名函数、闭包

函数可以没有参数或接受多个参数。
注意类型在变量名 之后。

func add(x int, y int) int {
	return x + y
}

func main() {
	fmt.Println(add(42, 13))	//55
}

当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略。

func add(x, y int) int {
	return x + y
}

func main() {
	fmt.Println(add(42, 13))
}

不定长度变参

func main() {
	A(1, 2, 3, 4, 5)
}

func A(a ...int) {
	fmt.Println(a) //[1 2 3 4 5]
}

多返回值、命名返回值参数

func split(sum int) (x, y int) {
	x = sum * 4 / 2
	y = sum - x
	return
}

func main() {
	fmt.Println(split(17))	//34 -17
}

闭包

func main() {
	f := closure(10)
	fmt.Println(f(11))	//21
}

func closure(x int) func(int) int {
	return func(y int) int {
		return x + y
	}
}

斐波纳契闭包

func fibonacci() func() int {
	f0, f1, f2 := 0, 1, 0
	index := 0
	return func() int{
		if index == 0 {
			index += 1
			return f0
		} else if index == 1 {
			index += 1
			
			return f1
		} else {
			f2 = f0 + f1
			f0 = f1
			f1 = f2
			return f2
		}
	}
}

func main() {
	f := fibonacci()
	for i := 0; i < 100; i++ {
		fmt.Println(f())
	}
}

demo

func main() {
	var fs = [4]func(){}

	for i := 0; i < 4; i++ {
		defer fmt.Println("defer i = ", i)
		defer func() {
			fmt.Println("defer_closure i = ", i)
		}()
		fs[i] = func() {
			fmt.Println("closure i = ", i)
		}
	}

	for _, f := range fs {
		f()
	}
}

结果:

closure i = 4
closure i = 4
closure i = 4
closure i = 4
defer_closure i = 4
defer i = 3
defer_closure i = 4
defer i = 2
defer_closure i = 4
defer i = 1
defer_closure i = 4
defer i = 0

猜你喜欢

转载自blog.csdn.net/weixin_36302575/article/details/85959097