golang return defer panic 对返回值的影响
資深大佬 : xmge 3
package main import ( "errors" "fmt" "log" ) // return 和 defer panic 关于返回值详解 // return:是把一个变量保存到零时变量,如果函数返回值中申明了变量,这会将结果保存到这个变量中。 // defer:是在 return 后执行的,如果函数返回值中没有申明变量,则 defer 中无法修改返回值,如果函数返回值中有申明变量,则 defer 可以通过修改这个变量来修改返回值 // panic: 如果 panic 则不会执行 return 语句,直接执行 defer 语句,执行 defer 语句,如果 defer 语句没有对变量进行改变,则默认返回返回类型的零值。 func main() { fmt.Println(test1()) fmt.Println(test2()) fmt.Println(test3()) } // 函数返回值没有申明变量, // return 时,把 i 保存进了 temp 变量(临时保存变量的地方) // defer 时,把 i 进行了+1,由 2 变为了 3,但是并没有改变 temp 的值,所有结果还是 2 func test1() int { var i = 1 defer func() { err := recover() if err != nil { log.Println(err) } i++ }() i++ return i } // 函数返回值没有申明变量, // return 之前有 panic,所以没有执行 return 语句,因此返回值中为 temp=0 (返回类型的默认值) // defer 时,把 i 进行了+1,由 0 变为了 1,但是并没有改变 temp 的值,所有结果还是 0 func test2() int { var i = 1 defer func() { err := recover() if err != nil { log.Println(err) } i++ }() panic(errors.New("this is panic")) return ret(i) } // 函数返回值申明变量了变量 i // return 之前有 panic,所以没有执行 return 语句,因此返回值中为 i=0 (返回类型的默认值) // defer 时,把 i 进行了+1,由 0 变为了 1,此时 i 就是保存返回结果的变零,因此返回结果为 1 func test3() (i int) { defer func() { err := recover() if err != nil { log.Println(err) } i++ }() panic(errors.New("this is panic")) return ret(i) } func ret(i int) int { fmt.Println("call return function") i++ return i } // test1: // 2 // 2020/11/19 17:38:55 this is panic // test2: // 0 // 2020/11/19 17:38:55 this is panic // test3: // 1
今天刚刚发现这块知识不太熟,大佬们随便看看…
大佬有話說 (0)