Go學習筆記(五)

(文章持續更新中...有志同道合的人能夠一塊兒探討下。整個系列(1~8)準備重寫,不過都是很基礎的入門筆記,想學到很深刻的東西則不建議閱讀...)bash

函數是實現一些功能的代碼塊,能夠提升應用的模塊性和複用率。閉包

題外話,React的組件化也是爲了代碼複用,組件能夠看做一個函數,Props是外部傳參,state是函數內部狀態或者內部變量。函數

普通函數須要先聲明才能調用。同一個包內,函數不能同名。支持多返回值組件化

包(package)是 Go 源碼的一種組織方式,一個包能夠認爲是一個文件夾。ui

Go 語言的函數聲明以 func 標識,後面緊接着函數名、參數列表、返回參數列表及函數體
func foo( a int, b string ){
    ... // 函數體
}
複製代碼

參數列表中,若有多個參數變量,則以逗號分隔,若是相鄰變量是同類型,則能夠將類型省略spa

func add(a, b int) int {
    return a + b
}
// 函數能夠有多個返回值
conn, err := connectToNetwork()
複製代碼

閉包是引用了自由變量的函數,被引用的自由變量和函數一同存在,即便已經離開了自由變量的環境也不會被釋放或者刪除,在閉包中能夠繼續使用這個自由變量。code

Go語言支持可變參數特性,函數聲明和調用時沒有固定數量的參數.接口

func 函數名(固定參數列表, v … T)(返回參數列表){
    函數體
}
複製代碼

Go 語言的 defer 語句會將其後面跟隨的語句進行延遲處理。在 defer 歸屬的函數即將返回時,將延遲處理的語句按 defer 的逆序進行執行,也就是說,先被 defer 的語句最後被執行,最後被 defer 的語句,最早被執行。壓棧出棧的緣由。開發

package main
import (
    "fmt"
)
func main() {
    fmt.Println("defer begin")
    // 將defer放入延遲調用棧
    defer fmt.Println(1)
    defer fmt.Println(2)
    // 最後一個放入, 位於棧頂, 最早調用
    defer fmt.Println(3)
    fmt.Println("defer end")
}
複製代碼

Go語言函數處理思想源碼

  • 一個可能形成錯誤的函數,須要返回值中返回一個錯誤接口(error)。若是調用是成功的,錯誤接口將返回 nil,不然返回錯誤
  • 在函數調用後須要檢查錯誤,若是發生錯誤,進行必要的錯誤處理。

net.Dial() 是 Go 語言系統包 net 即中的一個函數,通常用於建立一個 Socket 鏈接。net.Dial 擁有兩個返回值,Conn 和 error

func Dial(network, address string) (Conn, error) {
    var d Dialer
    return d.Dial(network, address)
}
複製代碼

手動觸發宕機

Go 語言能夠在程序中手動觸發宕機,讓程序崩潰,這樣開發者能夠及時地發現錯誤,同時減小可能的損失

package main

func main() {
    panic("crash")
}

// 程序崩潰,輸出內容以下
panic: crash

goroutine 1 [running]:
main.main()
    F:/src/tester/main.go:5 +0x6b

複製代碼

Go語言提供宕機恢復功能,防止程序崩潰。Go 沒有異常系統,其使用 panic 觸發宕機相似於其餘語言的拋出異常,那麼 recover 的宕機恢復機制就對應 try/catch 機制

相關文章
相關標籤/搜索