51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

go内置函数介绍 (以及go panic/ go recover)

go语言内置函数介绍 {#autoid-2-5-3}

| 内置函数 | 介绍 | |---------------|----------------------------------------| | close | 主要用来关闭channel | | len | 用来求长度,比如string、array、slice、map、channel | | new | 用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针 | | make | 用来分配内存,主要用来分配引用类型,比如chan、map、slice | | append | 用来追加元素到数组、slice中 | | panic和recover | 用来做错误处理 |

panic/recover {#autoid-3-0-3}

Go语言中目前(Go1.12)是没有异常机制,但是使用panic/recover模式来处理错误。 panic可以在任何地方引发,但recover只有在defer调用的函数中有效。 首先来看一个例子:

func funcA() {
	fmt.Println("func A")
}
func funcB() {
panic("panic in B")
}
func funcC() {
	fmt.Println("func C")
}
func main() {
funcA()
funcB()
funcC()
}

输出:

func A
panic: panic in B

goroutine 1 [running]:
main.funcB(...)
        .../code/func/main.go:12
main.main()
        .../code/func/main.go:20 +0x98

程序运行期间funcB中引发了panic导致程序崩溃,异常退出了。这个时候我们就可以通过recover将程序恢复回来,继续往后执行。

func funcA() {
	fmt.Println("func A")
}
func funcB() {
defer func() {
		err := recover()
//如果程序出出现了panic错误,可以通过recover恢复过来
if err != nil {
			fmt.Println("recover in B")
}
}()
panic("panic in B")
}
func funcC() {
	fmt.Println("func C")
}
func main() {
funcA()
funcB()
funcC()
}

注意:

  1. recover()必须搭配defer使用。
  2. defer一定要在可能引发panic的语句之前定义。

练习题 {#autoid-3-0-4}

  1. 分金币
/*
你有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 main() {
	left := dispatchCoin()
	fmt.Println("剩下:", left)
}
赞(6)
未经允许不得转载:工具盒子 » go内置函数介绍 (以及go panic/ go recover)