Go语言复习中,如何深入理解函数、panic与recover机制?

2026-05-22 12:471阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计670个文字,预计阅读时间需要3分钟。

Go语言复习中,如何深入理解函数、panic与recover机制?

内容回顾+函数+函数的定义:func 函数名(参数1, 参数2...) 返回值 { 函数体 + 函数递归 + 高阶函数:函数可以作为参数也作为返回值闭包:函数和外部变量的引用defer:延迟调用,常用于处理处

内容回顾

函数

函数的定义

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

函数进阶

Go语言复习中,如何深入理解函数、panic与recover机制?

高阶函数:函数可以作为参数也可以作为返回值 闭包:函数和其外部变量的引用 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) } }

本文共计670个文字,预计阅读时间需要3分钟。

Go语言复习中,如何深入理解函数、panic与recover机制?

内容回顾+函数+函数的定义:func 函数名(参数1, 参数2...) 返回值 { 函数体 + 函数递归 + 高阶函数:函数可以作为参数也作为返回值闭包:函数和外部变量的引用defer:延迟调用,常用于处理处

内容回顾

函数

函数的定义

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

函数进阶

Go语言复习中,如何深入理解函数、panic与recover机制?

高阶函数:函数可以作为参数也可以作为返回值 闭包:函数和其外部变量的引用 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) } }