Go语言学习——复习函数、panic、recover

内容回顾

函数

函数的定义

func 函数名(参数1,参数2...)返回值{
    函数体
}

函数进阶

高阶函数:函数可以作为参数也可以作为返回值

闭包:函数和其外部变量的引用

defer:延迟调用 多用于处理资源释放

内置函数:

	panic和recover

package main

import "fmt"

//

func f1(name string) {
	fmt.Println("Hello", name)
}

// 函数作为参数
func f2(f func(string), name string){
	f(name)
}

// 函数作为返回值
func f3()func(int, int)int {
	// f := func (x, y int) int  {
	// 	return x + y
	// }
	// return f
	return func (x, y int) int  {
		return x + y
	}
}

func f4(f func()){
	f()
}

// 闭包
func f5(f func(string), name string)func(){
	return func() {
		f(name)
	}
}

func main () {
	f2(f1, "小乔")
	ret := f3()
	fmt.Printf("%T\n", ret)
	sum := ret(10, 20)
	fmt.Println(sum)
	fc := f5(f1, "China")
	f4(fc)
}

panic和recover

package main

import "fmt"

// panic 和 recover

func f1(){
	defer func ()  {
		err := recover() // 收集当前的错误
		fmt.Println("recover...")
		fmt.Println(err)
	}()
	panic("出现错误")
	fmt.Println("f1")
}

func f2(){
	fmt.Println("f2")
}

func main(){
	f1()
	f2()
}

作业:

package main

import "fmt"

//
/*
你有50枚金币,需要分配给以下几个人:Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaron,Elizabeth。
分配规则如下:
a. 名字中每包含1个'e'或'E'分1枚金币
b. 名字中每包含1个'i'或'I'分2枚金币
c. 名字中每包含1个'o'或'O'分3枚金币
d: 名字中每包含1个'u'或'U'分4枚金币

写一个程序,计算每个用户分到多少金币,以及最后剩余多少金币?
程序结构如下,请实现 ‘dispatchCoin’ 函数
*/
var (
	coins = 50
	users = []string{
		"Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
	}
	distribution = make(map[string]int, len(users))
)

func dispatchCoin() (left int) {
	// 1. 依次拿到每个人的名字
	for _, name := range users {
		// 2. 拿到一个人名根据分金币的规则去分金币
		for _, c := range name {
			switch c {
			case 'e', 'E':
				// 满足这个条件 分1枚金币
				distribution[name] ++
				coins --
			case 'i', 'I':
				// 满足这个条件 分2枚金币
				distribution[name] += 2
				coins -= 2
			case 'o', 'O':
				// 满足这个条件 分3枚金币
				distribution[name] += 3
				coins -= 3
			case 'u', 'U':
				// 满足这个条件 分4枚金币
				distribution[name] += 4
				coins -= 4

			}
		}
	}
	left = coins
	// 2.1 每个人分的金币数都都应该保存到 distribution 中
	// 2.2 还要记录下剩余的金币数
	// 3. 整个第2步执行完就能得到最终每个人分的金币数和剩余金币数
	return
}

func main() {
	left := dispatchCoin()
	fmt.Println("剩下:", left)
	for k, v := range distribution {
		fmt.Printf("%s: %d\n", k, v)
	}
}
posted @ 2022-05-20 23:02  寻月隐君  阅读(46)  评论(0编辑  收藏  举报