1. 程式人生 > >關於go語言中的defer\panic\recover

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

defer的作用

類似其他語言的finally{},可以非常方便地在獲得資源之後直接defer釋放資源,保證資源釋放,或者其他的一些處理工作

defer的執行時機

在函式體執行完成之後,回到呼叫點之前。這意味這你可以在defer中修改return的值

函式中出現了錯誤(panic)defer中能夠執行到麼

大部分情況下都可以。極端情況如記憶體耗盡這樣的會直接結束程式。

recover之後的函式返回值是什麼?

這個問題是我最疑惑的,我們來使用一段程式碼實驗一下:

package main

import (
	"fmt"
)

func bigest(nums ...int) int {
	defer func(){
		if p := recover(); p != nil {
			fmt.Println("執行了recover", p)
		}
	}()
	result := 100
	for i := 0; i < len(nums); i++ {
		val := nums[i]
		fmt.Println("handle:", val, result)
		if val == 3 {
			panic("不會數3")
		}
		if val > result {
			result = val
		}
	}
	return result
}

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

結果每次輸出的最大值都是0。結論很明顯:panic之後的函式recover之後會返回返回型別的0值,可以改變一下返回的型別試試

什麼時候使用panic

無法預期的 錯誤,可預期的錯誤一般使用error返回值

什麼時候使用recover

無法緊要的任務出錯了,不想因此奔潰程式,可以使用recover僅僅記錄一條日誌