在panic的函数中更新返回值

在golang中我们知道可以用defer, panic, recover来处理一些情况,比如,一般panic的话,如果在函数中没有处理,就会向上继续抛出 有时候,我们希望在出错的情况下,能够返回一个值。这个时候,defer就会比较好的处理这种情况。

func test() (r int) {
  defer func() {
		if err := recover(); err != nil {
			log.Println("Error:", err)
      r = -1
		}
  }()
  panic("error")
  return 1;
}

比如这个代码,肯定会有个panic,当然如果没有那行panic代码的话,全部正确处理,应该是返回1, 但是有了panic后,在返回之前 会通过recover来得到这个panic, 最后更新返回值变量r为-1,从而在即使这个函数有了panic也会返回一个-1给调用者。