1. 程式人生 > 其它 >Go語言基礎之內建函式

Go語言基礎之內建函式

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()
}

注意:

  1. recover()必須搭配defer使用。
  2. 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執行的東西
}()
在當下的階段,必將由程式設計師來主導,甚至比以往更甚。