func test() (ret int){
ret = 10
return 1
}
函数的返回值是1
func test01() (ret int){
defer func(){
ret = 10
}()
return 1
}
函数的返回值是10
func test02() (ret int){
defer func(){
ret += 10
}()
return 1
}
函数的返回值是11
func test03() (ret int){
ret = 10
defer func(){
}()
return 1
}
返回值是1
func test04() (ret int) {
defer func(ret int) {
r = r + 5
}(ret)
return 1
}
func test05() (ret int) {
t := 5
defer func() {
t = t + 5
}()
return t
}
返回值是5
由此可见,显示声明返回值的函数处理返回值的时候有三种情况:
(1)如果defer中没有对返回值的处理,那么return关键字的优先级高于显示的声明的返回值;如test()
(2)如果defer中存在对返回值的闭包处理,那么实际的执行过程以test01为例:ret = 1,ret = 10, return ret
(3)函数调用的时候参数传入的是副本,所以非闭包调用的时候并没有修改返回值