相关疑难解决方法(0)

为什么在Golang中关闭体后添加"()"?

我正在阅读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
}
Run Code Online (Sandbox Code Playgroud)

我不清楚在封闭体之后添加和使用"()"的原因,希望有人能够清楚地解释这一点.

closures go

42
推荐指数
3
解决办法
2万
查看次数

golang如何"推迟"捕获闭包的参数?

这是我的代码(运行):

package main

import "fmt"

func main() {
    var whatever [5]struct{}

    for i := range whatever {
        fmt.Println(i)
    } // part 1

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

    for i := range whatever {
        defer func(n int) { fmt.Println(n) }(i)
    } // part 3
}
Run Code Online (Sandbox Code Playgroud)

输出:

0 1 2 3 4 4 3 2 1 0 4 4 4 4 4

问题:第2部分和第3部分有什么区别?为什么第2部分输出"44444"而不是"43210"?

closures go

32
推荐指数
1
解决办法
9814
查看次数

德弗尔打电话去常规

我相信我理解在正常使用情况下推迟.比如这个问题中列出的Golang defer行为.然而,当一个不返回的goroutine内部调用defer时,我有点感到困惑.这是有问题的代码.

func start_consumer() {
    conn, _ := amqp.Dial("amqp://username:password@server.com")
    //defer conn.Close()

    ch, _ := conn.Channel()
    //defer ch.Close()

    q, _ := ch.QueueDeclare(
        "test", // name
        true,   // durable
        false,  // delete when unused
        false,  // exclusive
        false,  // no-wait
        nil,    // arguments
    )

    _ = ch.Qos(
        3,     // prefetch count
        0,     // prefetch size
        false, // global
    )

    forever := make(chan bool)

    go func() {
        for {
            msgs, _ := ch.Consume(
                q.Name, // queue
                "",     // consumer
                false,  // …
Run Code Online (Sandbox Code Playgroud)

go

1
推荐指数
1
解决办法
2850
查看次数

标签 统计

go ×3

closures ×2