内容回顾 函数 函数的定义 func 函数名(参数1,参数2...)返回值{ 函数体} 函数进阶 高阶函数:函数可以作为参数也可以作为返回值闭包:函数和其外部变量的引用defer:延迟调用 多用于处
内容回顾
函数
函数的定义
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)
}
}