github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/12_cgo/defer/main.go (about) 1 // 求下面f 的返回值 2 // defer是在return之前执行的, return xxx这一条语句并不是一条原子指令! 3 4 // 将返回值进行拆分 5 /* 6 返回值 = xxx 7 调用defer函数 8 空的return 9 */ 10 11 package main 12 13 import "fmt" 14 15 func main() { 16 fmt.Println(f1()) 17 fmt.Println(f2()) 18 fmt.Println(f3()) 19 fmt.Println(doubleScore(0)) //0 20 fmt.Println(doubleScore(20.0)) //40 21 fmt.Println(doubleScore(50.0)) //50 22 } 23 24 func f1() (result int) { 25 defer func() { 26 result++ 27 }() 28 return 0 29 } 30 31 /* 32 func f1() (result int) { 33 result = 0 //return语句不是一条原子调用,return xxx其实是赋值+ret指令 34 defer func() {//defer被插入到return之前执行,也就是赋返回值和ret指令之间 35 result++ 36 }() 37 return //空的return 38 } 39 */ 40 41 func f2() (r int) { 42 t := 5 43 defer func() { 44 t = t + 5 45 }() 46 return t 47 } 48 49 /* 50 func f2() (r int) { 51 t := 5 52 r = t //defer被插入到赋值与返回之间执行,这个例子中返回值r没被修改过 53 defer func() { 54 t = t + 5 55 }() 56 return // 空指令 57 } 58 */ 59 60 func f3() (r int) { 61 defer func(r int) { //这里改的r是传值传进去的r,不会改变要返回的那个r值 62 r = r + 5 63 }(r) 64 return 1 65 } 66 67 /* 68 69 func f3() (r int) { 70 r = 1 //给返回值赋值 71 defer func(r int) { 72 r = r + 5 73 }(r) 74 return //空的return 75 } 76 77 */ 78 79 func doubleScore(source float32) (score float32) { 80 defer func() { 81 if score < 1 || score >= 100 { 82 //将影响返回值 83 score = source 84 } 85 }() 86 score = source * 2 87 return 88 //或者 89 //return source * 2 90 }