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

为什么在Golang的闭包主体之后添加“()”?

强阳曜
2023-03-14
问题内容

我正在阅读The Go Programming Language Specifications,发现在关闭正文之后,自己对“()”并不真正了解:

Function literals

func(ch chan int){ch < -ACK } (replyChan) `

Defer statements的示例中:

// f returns 1
func f() (result int) {
    defer func() {
        result++
    }() // why and how?
    return 0
}

我不清楚关闭主体后添加和使用“()”的原因,希望有人可以清楚地解释一下。


问题答案:

这并不是说()必须(仅)一个后添加
defer。defer语句的语言规范要求其“
Expression” 始终 必须是函数调用。

为什么会这样呢?不管是否“推迟”,它与任何其他功能相同:

考虑:

func f() int { return 42 }

a := f

b := f()

第一表达式RHS是函数值。在第二个版本中,RHS是函数 返回 的值-即函数调用。

的语义也是如此:

defer f

defer f()

除了在“ defer”的上下文中第一个版本没有意义外,因此规范中提到它必须是第二种形式(仅)。

由于与上面讨论的’defer’语句之外的函数调用具有正交性,因此IMHO也更容易学习。

还要注意,函数调用不仅是fn-expr后跟(),而且表达式列表通常在括号内(包括一个空列表)。之间有很大的区别:

for i := range whatever {
        defer func() { fmt. Println(i) }()
}

for i := range whatever {
        defer func(n int) { fmt. Println(n) }(i)
}

关闭时,第一个版本在当下打印的“我”的值 执行 ,第二打印“我”在当下的价值时,defer语句 执行。



 类似资料:
  • 问题内容: 考虑以下Golang代码(也在Go Playground上): 此代码产生以下输出: 假设这不是一些奇怪的编译器错误,我很好奇为什么a)s的值在goroutine版本中的解释与常规func调用中的不同,并且b)为什么将其分配给循环内的局部变量起作用?两种情况。 问题答案: Go中的闭包在词法范围内。这意味着闭包内从“外部”范围引用的任何变量都不是副本,而是实际上是引用。一环竟重复使用相

  • 闭包是一个特殊的匿名函数,它是匿名函数和相关引用环境组成的一个整体 也就是说只要匿名函数中用到了外界的变量,那么这个匿名函数就是一个闭包 package main import "fmt" func main() { num := 10 a := func() { num++ // 在闭包中用到了main函数中的num, 所以这个匿名函数就是一个闭包

  • 我不清楚< code>Subject和< code>BehaviorSubject之间的区别。只是一个< code>BehaviorSubject有< code>getValue()函数吗?

  • 本文向大家介绍什么是闭包(closure)为什么要用它相关面试题,主要包含被问及什么是闭包(closure)为什么要用它时的应答技巧和注意事项,需要的朋友参考一下 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。 闭包的特性: 1.函数内再嵌套函数

  • 问题内容: 与函数相反,类的主体在定义时执行: 出: 为什么会这样呢?它与/方法和类属性有关吗? 问题答案: *Python首次导入模块时, *所有操作 均在模块级别执行。函数体(和生成器表达体)在这里是 例外 ,而不是规则。Python执行所有操作以创建模块中包含的 对象 ;像Python中的所有内容一样,类是对象,函数也是。 类主体使用单独的代码对象的唯一原因是因为类主体是在单独的名称空间中执

  • React引入了新的静态方法,它在每个呈现方法之前都会被调用,但为什么呢?在prop change之后调用它对我来说是有意义的,但是在之后调用它就没有意义了,也许我错过了什么。 我根据公司的要求创建了一个组件,在组件中日期是从道具控制的。我在组件中有以下状态。 是的,我在中创建了一个额外的变量来跟踪是否由于而被调用,但我认为这不是正确的方法。 或者是我做错了什么或者遗漏了什么,或者不应该在之后调用