我刚开始学习Go,我对Go博客中使用defer更改命名返回值的一个示例感到困惑--defer、Panic和recover。
func c() (i int) {
defer func() { i++ }()
return 1
}
我在下面的代码中进行了测试,在函数b
中,它返回1,因为它不是上面提到的“没有参数的返回语句”。
func a() (i int) { // return 2
i = 2
return
}
func b() (i int) { // return 1
i = 2
return 1
}
我的问题是,在第一个示例中,周围的函数c有一个命名的返回值i,但是函数c
使用return1
,在第二个示例中,我们可以看到,无论i
是什么值,它都应该返回1。但是为什么在i
更改延迟函数后,c
函数返回i
的值,而不是值1?
当我在输入我的问题时,我可能已经猜到了答案。是因为:
return 1
i = 1
return
请帮我确认一下,谢谢!
defer语句将函数调用推送到列表上。保存的调用列表在周围函数返回后执行。--围棋博客:推迟、恐慌和恢复
理解上述说法的另一种方式:
defer语句将函数调用推送到堆栈上。在周围函数返回之前立即调用保存调用、弹出(LIFO)和延迟函数的堆栈。
func c() (i int) {
defer func() { i++ }()
return 1
}
func c() (i int) {
defer func() { fmt.Println("third") }()
defer func() { fmt.Println("second") }()
defer func() { fmt.Println("first") }()
return 1
}
处决顺序:
问题内容: 我刚开始学习Go,但是我对一个例子感到困惑,那就是在The Go Blog中使用defer更改命名的返回值-Defer,Panic和Recover。 该示例说: 延迟函数可以读取并分配给返回函数的命名返回值。 在此示例中,延迟函数在周围函数返回后递增返回值i。因此,此函数 返回2 : 但正如我从A Go of Go中学到 的-命名返回值 不带参数的return语句 返回命名的返回值。这
延迟函数可以读取并分配给返回函数的命名返回值。 我想程序员的意图是返回1作为结果,并想知道为什么它被重写,以及后面的设计决策是什么。
函数接受参数。在 Go 中,函数可以返回多个“结果参数”,而不仅仅是一个值。它们可以像变量那样命名和使用。 如果命名了返回值参数,一个没有参数的return语句,会将当前的值作为返回值返回。注意,如果遇到if等代码块和返回值同名,还需要显示写出返回值。 package main import "fmt" func split(sum int) (x, y int) { x = sum *
本文向大家介绍c++命名的返回值省略,包括了c++命名的返回值省略的使用技巧和注意事项,需要的朋友参考一下 示例 如果从函数返回左值表达式,则此左值: 表示该函数局部的自动变量,将在 return 自动变量不是函数参数 并且变量的类型与函数的返回类型相同 如果所有这些都成立,那么可以取消从左值的复制/移动: 更复杂的情况适合进行省略,但情况越复杂,编译器实际淘汰它的可能性就越小: 编译器仍然可以忽
问题内容: 我想构建一个Utils类,以使Volley调用更简单,如下所示: Utils.java: MainActivity.java: 当应用运行时,jsonObject始终为null。我想问一下是否可以延迟在makeJsonObjectRequest中返回jsonObject [0]直到调用onResponse。我可以这样做吗?。 问题答案: 我创建了此文件,并按照以下方式进行管理,请看一下
我现在和索纳库贝有矛盾。我有一个validator服务(它检查我通过API接收的DTO是否在Double和String对象(不是原语)中不包含空值)。