我对返回值使用“延迟”有一些问题。我尝试以不同的方式运行一个测试函数(只是 i 的定义不同),但结果不同。所以,我对不同的返回值感到困惑。这是问题所在:功能 1:package mainimport "fmt"func main() { fmt.Println("a return:", a()) // return value: 0}func a() int { var i int defer func() { i++ fmt.Println("a defer1:", i) // print " a defer1: 1" }() return i}返回值:a defer1: 1a return: 0功能2:package mainimport "fmt"func main() { fmt.Println("a return:", a()) // return value: 1}func a() (i int) { defer func() { i++ fmt.Println("a defer1:", i) // print " a defer1: 1" }() return i}返回值:a defer1: 1a return: 1一个返回值是0,另一个是1。所以,问题是这两个函数有什么区别。
1 回答
素胚勾勒不出你
TA贡献1827条经验 获得超9个赞
这两个功能有什么区别?
Go 编程语言规范
推迟声明
“延迟”语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻。
每次执行“defer”语句时,调用的函数值和参数都会像往常一样计算并重新保存,但不会调用实际函数。相反,延迟函数会在周围函数返回之前立即被调用,顺序与它们被延迟的顺序相反。
如果延迟函数是一个函数文字,并且周围的函数在文字范围内命名了结果参数,则延迟函数可以在返回结果参数之前访问和修改结果参数。如果延迟函数有任何返回值,它们将在函数完成时被丢弃。
不同之处在于带有命名结果参数的周围函数
func a() (i int)
与具有未命名结果参数的周围函数
func a() int
- 1 回答
- 0 关注
- 140 浏览
添加回答
举报
0/150
提交
取消