Go之函式與異常
阿新 • • 發佈:2020-10-12
package main import "fmt" // import "strings" // 函式接收可變引數 // 當多個引數是相同型別時,可以只將資料型別寫在最後一個引數裡面 func intSum(nums ...int)(sum, len int){ // 可變引數在函式體中是切片型別 for _, num := range(nums){ // 當返回值有變數名時,不需要重新宣告 sum += num } len = cap(nums) // 函式在即將要結束的時候按照逆序的方式,執行被defer修飾的語句,通常用來處理資源的釋放問題 defer fmt.Println(999) defer fmt.Println(998) return sum, len } func main() { // go語言中支援函式、匿名函式和閉包,並且函式 // 在go語言中屬於“一等公民” sum, len := intSum(1,2) fmt.Println(sum, len) // 函式是可以作為變數的 testFunc := intSum fmt.Printf("%T\n", testFunc) // 匿名函式 // 匿名函式就是沒有函式名的函式,匿名函式多用於實現回撥函式和閉包 func(x int){ fmt.Println(x) }(10) // 閉包 // 閉包指的是一個函式與其相關的引用環境組合而成的實體 // 簡單來說,閉包=函式+引用環境 // funca 此時就是閉包 // 判斷函式是不是閉包,就要判斷函式內部有沒有引用外層的作用域的變數 funca := a() funca() b() // recover()必須搭配defer使用 // defer一定要在可能引發painc的語句之前定義 } // 把函式作為返回值 func a() func(){ name := "古力娜扎" return func(){ fmt.Println(name) } } func b(){ // defer註冊 defer func(){ // 收集相關錯誤資訊 err := recover() if err != nil{ fmt.Println("func b err") } }() // 觸發painc panic("painc in b") }