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  }