我刚开始学习Go,但是我对一个例子感到困惑,那就是在The Go Blog中使用defer更改命名的返回值-Defer,Panic和Recover。
该示例说:
- 延迟函数可以读取并分配给返回函数的命名返回值。
在此示例中,延迟函数在周围函数返回后递增返回值i。因此,此函数 返回2 :
func c() (i int) {
defer func() { i++ }()
return 1
}
但正如我从A Go of Go中学到
的-命名返回值
不带参数的return语句 返回命名的返回值。这就是所谓的“裸”回报。
我在下面的代码中进行了测试,并在函数中b
返回1,因为它不是上面提到的“ 无参数的返回语句 ”情况。
func a() (i int) { // return 2
i = 2
return
}
func b() (i int) { // return 1
i = 2
return 1
}
所以我的问题是在第一个示例中,周围的函数c有一个命名的返回值i,但是该函数c
使用return 1
第二个示例中的函数,无论值i
是多少,我们都可以看到它应该具有return 1
。但是,为什么在i
更改延迟函数后,该c
函数返回值i
而不是值1?
在输入问题时,我可能已经猜到了答案。是因为:
return 1
等于:
i = 1
return
在具有命名返回值变量的函数中i
?
请帮我确认一下,谢谢!
defer语句将函数调用推送到列表上。周围函数返回后,将执行保存的呼叫列表。-
转到博客:延期,恐慌和恢复
理解上述陈述的另一种方式:
defer语句 将 函数调用压入 堆栈 。 弹出 的已保存调用 (LIFO) 和延迟函数的堆栈在周围函数返回之前立即被调用。
func c() (i int) {
defer func() { i++ }()
return 1
}
返回1后,func() { i++ }()
将执行延迟。因此,按执行顺序:
为了理解起见:
func c() (i int) {
defer func() { fmt.Println("third") }()
defer func() { fmt.Println("second") }()
defer func() { fmt.Println("first") }()
return 1
}
执行顺序:
我刚开始学习Go,我对Go博客中使用defer更改命名返回值的一个示例感到困惑--defer、Panic和recover。 我在下面的代码中进行了测试,在函数中,它返回1,因为它不是上面提到的“没有参数的返回语句”。 我的问题是,在第一个示例中,周围的函数c有一个命名的返回值i,但是函数使用,在第二个示例中,我们可以看到,无论是什么值,它都应该返回1。但是为什么在更改延迟函数后,函数返回的值,而不
延迟函数可以读取并分配给返回函数的命名返回值。 我想程序员的意图是返回1作为结果,并想知道为什么它被重写,以及后面的设计决策是什么。
函数接受参数。在 Go 中,函数可以返回多个“结果参数”,而不仅仅是一个值。它们可以像变量那样命名和使用。 如果命名了返回值参数,一个没有参数的return语句,会将当前的值作为返回值返回。注意,如果遇到if等代码块和返回值同名,还需要显示写出返回值。 package main import "fmt" func split(sum int) (x, y int) { x = sum *
本文向大家介绍c++命名的返回值省略,包括了c++命名的返回值省略的使用技巧和注意事项,需要的朋友参考一下 示例 如果从函数返回左值表达式,则此左值: 表示该函数局部的自动变量,将在 return 自动变量不是函数参数 并且变量的类型与函数的返回类型相同 如果所有这些都成立,那么可以取消从左值的复制/移动: 更复杂的情况适合进行省略,但情况越复杂,编译器实际淘汰它的可能性就越小: 编译器仍然可以忽
如果我使用的术语不正确,我必须首先道歉。我只使用Groovy/Java来完成自动化任务(Gradle),而且我没有多年交付生产级软件的经验。 因此,我面临的挑战如下:我有一个规范,它试图测试返回字符串是否符合预期(几乎与此相同)。 然而,不同之处在于,我的方法约束返回一个主体对象,而我真正想要存根的对象是toString()。我认为我在上面做得正确,但它没有给出我期望的结果。 这是我的帮手班。 如
问题内容: 我想构建一个Utils类,以使Volley调用更简单,如下所示: Utils.java: MainActivity.java: 当应用运行时,jsonObject始终为null。我想问一下是否可以延迟在makeJsonObjectRequest中返回jsonObject [0]直到调用onResponse。我可以这样做吗?。 问题答案: 我创建了此文件,并按照以下方式进行管理,请看一下