Go語言聖經(中文版)讀書筆記(五)
阿新 • • 發佈:2018-12-22
5.函式
- 函式宣告
- 遞迴
- 多返回值
- 錯誤
- 函式值
- 匿名函式
- 可變引數
- Deferred函式
- Panic異常
- Recover捕獲異常
函式宣告
func name(parameter-list) (result-list) {
body
}
//result-list中可以宣告返回值,這樣這個返回值會先被初始化。最後函式只要return就可以自動返回result-list的值。
遞迴:go的遞迴與其他語言一樣
下面是我自己寫的一個遞迴的小程式,求階乘
package main
import "fmt"
func main() {
fmt.Println(Factorial(3))
}
func Factorial(start int) int {
if start > 1 {
return Factorial(start-1) * start
} else {
return 1
}
}
特別注意原文中這樣一句話:
Go語言使用可變棧,棧的大小按需增加(初始時很小)。這使得我們使用遞迴時不必考慮溢位和安全問題。
多返回值:
引數、返回值的命名最好是有意義的,這樣能讓我們在閱讀程式碼的時候能夠更快的知道意思。
如果返回值中某個值不被使用,可以將其分配給blank identifier:links, _ := findLinks(url)
錯誤:錯誤不是異常,錯誤是我們在程式設計中可以預料的並且在程式中需要顯示處理的。Go使用控制流機制(如if和return)處理異常,這使得編碼人員能更多的關注錯誤處理。
錯誤處理策略:
- 向上傳播錯誤
- 重試(防止無限重試)
- 輸出錯誤資訊並結束程式(這個方法只在main函式中執行)。
- 有時,我們只需要輸出錯誤資訊就足夠了,不需要中斷程式的執行。我們可以通過log包提供函式
- 我們可以直接忽略掉錯誤。
匿名函式
擁有函式名的函式只能在包級語法塊中被宣告,通過函式字面量(function literal),我們可繞過這一限制,在任何表示式中表示一個函式值。
可變引數
在宣告可變引數函式時,需要在引數列表的最後一個引數型別之前加上省略符號“…”,這表示該函式會接收任意數量的該型別引數。
func sum(vals...int) int {
total := 0
for _, val := range vals {
total += val
}
return total
}
values := []int{1, 2, 3, 4}
fmt.Println(sum(values...)) // "10"
Deferred函式
只需要在呼叫普通函式或方法前加上關鍵字defer,就完成了defer所需要的語法。當defer語句被執行時,跟在defer後面的函式會被延遲執行。直到包含該defer語句的函式執行完畢時,defer後的函式才會被執行,不論包含defer語句的函式是通過return正常結束,還是由於panic導致的異常結束。你可以在一個函式中執行多條defer語句,它們的執行順序與宣告順序相反。
func title(url string) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
ct := resp.Header.Get("Content-Type")
if ct != "text/html" && !strings.HasPrefix(ct,"text/html;") {
return fmt.Errorf("%s has type %s, not text/html",url, ct)
}
doc, err := html.Parse(resp.Body)
if err != nil {
return fmt.Errorf("parsing %s as HTML: %v", url,err)
}
// ...print doc's title element…
return nil
}
Panic異常
Recover捕獲異常