Go基础及语法(三)

函数

函数的定义

package main

import "fmt"

/*
func 函数名(参数1 类型1,参数2 类型2) 返回值类型 {
	函数体
}
*/
func add(a, b int) int {
	return a + b
}

func main() {
	a := add(1, 2)
	fmt.Println(a) //3
}

函数进阶

高阶函数

package main

import "fmt"

func add(a, b int) int {
	return a + b
}

func sub(a, b int) int {
	return a - b
}

func maths(a func(int, int) int, b, c int) int {
	return a(b, c)
}

func call() func(int, int) int {
	return func(a, b int) int {
		return a + b
	}
}

func main() {
	a := maths(add, 1, 2)
	b := maths(sub, 1, 2)
	ret := call()
	fmt.Println(a, b, ret(3, 4)) //3 -1 7
}

闭包

package main

import "fmt"

func add(a, b int) {
	fmt.Println(a + b)
}

func closure(f func(a, b int), a, b int) func() {
	return func() {
		f(a, b)
	}
}

func f(fn func()) {
	fn()
}

func main() {
	a := closure(add, 1, 2)
	f(a)
}

defer延迟调用
package main

import "fmt"

func add(a, b int) {
	fmt.Println(a + b)
}

func main() {
	defer add(1, 2) //先打印7后打印3
	add(3, 4)
}

内置函数panic和recover

package main

import "fmt"

func f_1() {
	defer func() {
		err := recover() //recover记录错误,跳出函数,程序不停止,继续运行
		fmt.Println(err) //打印runtime error: integer divide by zero
	}()
	a := 1
	b := 0
	fmt.Println("f1") //打印f1
	fmt.Println(a / b) //异常
	fmt.Println("f2") //不会打印f2
}

func f_2() {
	panic("抛出异常") // panic抛出异常,程序会终止
	fmt.Println("f3") //不会被打印f3
}

func main() {
	f_1()
	f_2()
}

posted @ 2021-01-19 10:51  _Biko  阅读(74)  评论(0编辑  收藏  举报