package main
import (
"fmt"
)
func main() {
fmt.Println(f0()) // 1
fmt.Println(f1()) // 0
}
func f0() (result int) {
defer func() {
result++
}()
return 0
}
func f1() (result int) {
result = 0 //return语句不是一条原子调用,return xxx其实是赋值+RET指令
return
}
f0中明明返回的是0,是一个整形,虽然有个defer但是他还是一个数字0啊,为啥结果被改为了1 f1中return那里明明啥都没有,给人直观感受就是null,他怎么就被改为了0
go里面没有null
。编程靠只管感受?学习新语言就好好学习这门语言的语法,思想,不要混用。
问题1:defer 执行先于 return。所以会执行result++,因为你返回值定义了result变量,所以其值等于默认值0,result++等于1,只要定义了返回变量名,他会使用变量名返回,而不是你的 return 0
问题2:int默认值为0,slice,map这类复杂类型默认值才为nil
1. defer是延后执行,但是不会延后至return后,是在return之前触发defer
2. go的一切定义皆有默认值,int类型默认值0,string类型默认值'',bool类型默认值false,以此类推
3. 函数定义了返回值,就一定会要求有返回内容。但是函数定义返回值变量,只是简略的返回写法,return 等同于 return result。
4. f0 写了return 0,结果是却返回了1,这个就不太清楚了。