Go語言基礎之內建函式
阿新 • • 發佈:2021-10-17
Go語言基礎之內建函式
一、內建函式
內建函式 | 介紹 |
---|---|
close | 主要用來關閉channel |
len | 用來求長度,比如string、array、slice、map、channel |
new | 用來分配記憶體,主要用來分配值型別,比如int、struct。返回的是指標 |
make | 用來分配記憶體,主要用來分配引用型別,比如chan、map、slice |
append | 用來追加元素到陣列、slice中 |
panic和recover | 用來做錯誤處理 |
二、panic/recover
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() }
注意:
recover()
必須搭配defer
使用。defer
一定要在可能引發panic
的語句之前定義。
分金幣
/*
你有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)
}
package main
import "fmt"
var (
coins = 50
users = []string{
"Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
}
distribution = make(map[string]int, len(users))
)
func dispatchCoin() int {
for _, name := range users {
for _, c := range name {
switch c {
case 'e', 'E':
distribution[name]++
coins--
case 'i', 'I':
distribution[name] += 2
coins -= 2
case 'o', 'O':
distribution[name] += 3
coins -= 3
case 'u', 'U':
distribution[name] += 4
coins -= 4
}
}
}
return coins
}
func main() {
left := dispatchCoin()
fmt.Println("剩下:", left)
fmt.Println(distribution)
}
三、總結
異常處理
//以後的異常處理就是 拿到你要捕獲異常的前面
defer func() {
if error := recover(); error != nil {
fmt.Println(error) //如果有異常就執行
}
fmt.Println("這是finally的內容,不管程式是否出錯,都會執行") //finally執行的東西
}()
在當下的階段,必將由程式設計師來主導,甚至比以往更甚。