多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### defer常见案例 #### 案例一 ~~~go func deferFuncParameter() { var aInt = 1 defer fmt.Println(aInt) aInt = 2 return } ~~~ 参考答案: 输出1。延迟函数fmt.Println(aInt)的参数在defer语句出现时就已经确定了,所以无论后面如何修改aInt变量都不会影响延迟函数 #### 案例二 ~~~go func printArray(array *[3]int) { for i := range array { fmt.Println(array[i]) } } func deferFuncParameter() { var aArray = [3]int{1, 2, 3} defer printArray(&aArray) aArray[0] = 10 return } func main() { deferFuncParameter() } ~~~ 参考答案: 输出10、2、3三个值。延迟函数printArray()的参数在defer语句出现时就已经确定了,即数组的地址,由于延迟函数执行时机是在return语句之前,所以对数组的最终修改值会被打印出来 #### 案例三 ~~~go func deferFuncReturn() (result int) { i := 1 defer func() { result++ }() return i } ~~~ 参考答案: 函数输出2。函数的return语句并不是原子的,实际执行分为设置返回值–>ret,defer语句实际执行在返回前,即拥有defer的函数返回过程是:设置返回值–>执行defer–>ret。所以return语句先把result设置为i的值,即1,defer语句中又把result递增1,所以最终返回2