当前位置: 首页 > 知识库问答 >
问题:

延迟返回值和命名返回值是如何工作的?

霍伟彦
2023-03-14

我刚开始学习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 

请帮我确认一下,谢谢!

共有1个答案

漆雕正奇
2023-03-14

defer语句将函数调用推送到列表上。保存的调用列表在周围函数返回后执行。--围棋博客:推迟、恐慌和恢复

理解上述说法的另一种方式:

defer语句将函数调用推送到堆栈上。在周围函数返回之前立即调用保存调用、弹出(LIFO)和延迟函数的堆栈。

 func c() (i int) {
    defer func() { i++ }()
    return 1
}
    null
 func c() (i int) {
    defer func() { fmt.Println("third") }()
    defer func() { fmt.Println("second") }()
    defer func() { fmt.Println("first") }()

    return 1
}

处决顺序:

  1. i=1(返回1)
  2. “第一”
  3. “第二”
  4. “第三个”
 类似资料:
  • 问题内容: 我刚开始学习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对象(不是原语)中不包含空值)。