(文章持續更新中...有志同道合的人能夠一塊兒探討下。整個系列(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語言函數處理思想源碼
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 機制