当前位置: 首页 > 面试题库 >

延期和命名返回值如何工作?

姬捷
2023-03-14
问题内容

我刚开始学习Go,但是我对一个例子感到困惑,那就是在The Go Blog中使用defer更改命名的返回值-Defer,Panic和Recover。

该示例说:

  1. 延迟函数可以读取并分配给返回函数的命名返回值。

在此示例中,延迟函数在周围函数返回后递增返回值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++ }()将执行延迟。因此,按执行顺序:

  1. i = 1(返回1)
  2. i ++(延迟html" target="_blank">功能从堆栈中弹出并执行)
  3. i == 2(命名变量i的最终结果)

为了理解起见:

 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,我对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。我可以这样做吗?。 问题答案: 我创建了此文件,并按照以下方式进行管理,请看一下