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

命名返回值的延迟行为

钱志强
2023-03-14
func c() (i int) {
    defer func() { i++ }()
    return 1
}

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

我想程序员的意图是返回1作为结果,并想知道为什么它被重写,以及后面的设计决策是什么。

共有1个答案

米裕
2023-03-14

在return语句设置任何结果参数之后,但在函数返回其调用方之前,将执行延迟函数。
执行顺序:

func c() (i int) { // i = 0
    defer func() { i++ }()
    return 1  // i = 1
 // run deferred function here i++ => i = 2
}

请参见defer关键字的示例。

参见defer_statements:

lock(l)
defer unlock(l)  // unlocking happens before surrounding function returns

// prints 3 2 1 0 before surrounding function returns
for i := 0; i <= 3; i++ {
    defer fmt.Print(i)
}

// f returns 42
func f() (result int) {
    defer func() {
        // result is accessed after it was set to 6 by the return statement
        result *= 7
    }()
    return 6
}
 类似资料:
  • 我刚开始学习Go,我对Go博客中使用defer更改命名返回值的一个示例感到困惑--defer、Panic和recover。 我在下面的代码中进行了测试,在函数中,它返回1,因为它不是上面提到的“没有参数的返回语句”。 我的问题是,在第一个示例中,周围的函数c有一个命名的返回值i,但是函数使用,在第二个示例中,我们可以看到,无论是什么值,它都应该返回1。但是为什么在更改延迟函数后,函数返回的值,而不

  • 问题内容: 我刚开始学习Go,但是我对一个例子感到困惑,那就是在The Go Blog中使用defer更改命名的返回值-Defer,Panic和Recover。 该示例说: 延迟函数可以读取并分配给返回函数的命名返回值。 在此示例中,延迟函数在周围函数返回后递增返回值i。因此,此函数 返回2 : 但正如我从A Go of Go中学到 的-命名返回值 不带参数的return语句 返回命名的返回值。这

  • 本文向大家介绍c++命名的返回值省略,包括了c++命名的返回值省略的使用技巧和注意事项,需要的朋友参考一下 示例 如果从函数返回左值表达式,则此左值: 表示该函数局部的自动变量,将在 return 自动变量不是函数参数 并且变量的类型与函数的返回类型相同 如果所有这些都成立,那么可以取消从左值的复制/移动: 更复杂的情况适合进行省略,但情况越复杂,编译器实际淘汰它的可能性就越小: 编译器仍然可以忽

  • 函数接受参数。在 Go 中,函数可以返回多个“结果参数”,而不仅仅是一个值。它们可以像变量那样命名和使用。 如果命名了返回值参数,一个没有参数的return语句,会将当前的值作为返回值返回。注意,如果遇到if等代码块和返回值同名,还需要显示写出返回值。 package main import "fmt" func split(sum int) (x, y int) { x = sum *

  • 问题内容: 我想构建一个Utils类,以使Volley调用更简单,如下所示: Utils.java: MainActivity.java: 当应用运行时,jsonObject始终为null。我想问一下是否可以延迟在makeJsonObjectRequest中返回jsonObject [0]直到调用onResponse。我可以这样做吗?。 问题答案: 我创建了此文件,并按照以下方式进行管理,请看一下

  • 我有一个主题,它发出不同的和值 我想延迟值。如果发出了-值,而延迟是“延迟”,那么什么都不应该发生(应该是“无值更改”)。 考虑这张桌子 我希望情况很清楚。