在遞歸處理的調用中,在具體的工程實踐中通常會引入遞歸深度檢測,防止由於錯誤的數據形成系統的資源極大的消耗,本方法定義了一種通用簡單的遞歸檢查方法。函數
RecursiveDepthChecker
func RecursiveDepthChecker(max int) bool { //注意,這裏咱們跳過了本函數本身的棧,找到父調用的函數名 caller, _, _, _ := runtime.Caller(1) currentFuncName := runtime.FuncForPC(caller).Name() stack := make([]byte, 65535*1) //max 1MB stack traceback //因爲Golang Runtime中不少關於棧的函數未導出,沒法使用。所以使用最骯髒的字符串檢測方法 runtime.Stack(stack, false) start := 0 depth := 0 for { count := strings.Index(string(stack[start:]), currentFuncName) if count >= 0 { start += count + len(currentFuncName) depth++ } else { break } } if depth > max { return false } return true }
func TFunc() { fmt.Println("Start Caller...") if !RecursiveDepthChecker(5) { fmt.Println("Stack Overflow") return } TFunc() }