關於go語言中的defer\panic\recover

defer的做用

相似其餘語言的finally{},能夠很是方便地在得到資源以後直接defer釋放資源,保證資源釋放,或者其餘的一些處理工做函數

defer的執行時機

在函數體執行完成以後,回到調用點以前。這意味這你能夠在defer中修改return的值日誌

函數中出現了錯誤(panic)defer中可以執行到麼

大部分狀況下均可以。極端狀況如內存耗盡這樣的會直接結束程序。code

recover以後的函數返回值是什麼?

這個問題是我最疑惑的,咱們來使用一段代碼實驗一下:內存

package main

import (
	"fmt"
)

func biggest(nums ...int) int {
	defer func(){
		if p := recover(); p != nil {
			fmt.Println("執行了recover", p)
		}
	}()
	result := 100
	for _, val := range nums {
		fmt.Println("handle:", val, result)
		if val == 3 {
			panic("不會數3")
		}
		if val > result {
			result = val
		}
	}
	return result
}

func main(){
	largest := biggest(1,2,3,4)
	fmt.Println("largest:", largest)
}

結果每次輸出的最大值都是0。結論很明顯:panic以後的函數recover以後會返回返回類型的0值,能夠改變一下返回的類型試試資源

何時使用panic

沒法預期的 錯誤,可預期的錯誤通常使用error返回值class

何時使用recover

沒法緊要的任務出錯了,不想所以奔潰程序,能夠使用recover僅僅記錄一條日誌import

相關文章
相關標籤/搜索