加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 09:44:49 所属栏目:大数据 来源:网络整理
导读:我正在阅读的Go编程语言规范,发现我自己不真正理解与闭包体后面的“()”: 在函数文字: func(ch chan int) { ch - ACK } (replyChan) ` 在Defer语句的示例中: // f returns 1func f() (result int) { defer func() { result++ }() // why and how? return
我正在阅读的Go编程语言规范,发现我自己不真正理解与闭包体后面的“()”:

在函数文字:

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

在Defer语句的示例中:

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

我不清楚添加&使用“()”后封闭体,希望有人能够清楚地解释这一点。

它不是()必须添加后(只)一个闭包在延迟。语言规定 defer statement的任务,它的“表达式”总是必须是一个函数调用。

为什么会这样?它与任何其他函数相同,在’defer’或不:

考虑:

func f() int { return 42 }

a := f

vs

b := f()

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

因此,语义是:

defer f

vs

defer f()

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

它的IMHO也更容易学习,因为与’defer’语句之外的上述讨论的函数调用的正交性。

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

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

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

第一个版本在执行闭包时打印’i’的值,第二个版本在执行defer语句时打印’i’的值。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读