如何在不使用接收数据的情况下放电去通道?

时间:2017-11-23 05:12:35

标签: go

我创建了一个频道,并希望在不使用接收值的情况下将其释放。 但是,编译器不允许我编写这样的代码:

for i := range ch {
// code
}

抱怨我未被使用

代替_代替我没有工作

这样做的惯用方法是什么?

3 个答案:

答案 0 :(得分:2)

您可以使用select代替range

for {
        select {
        // read and discard
        case <-ch:
        // to avoid deadlock
        default:
            continue
        }

    }

但话又说回来,如果你不从中读取,你确定你真的需要这个频道吗?

答案 1 :(得分:2)

尝试this

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)
    close(ch)
    for range ch {
        fmt.Println("for")
    }
    fmt.Println("done")
}

输出:

done

答案 2 :(得分:0)

如果你不想陷入无限循环读取值,直到频道不为空:

exitLoop:
for {
    select {
    case <-ch:
    default:
        break exitLoop
    }
}

演示:https://play.golang.org/p/UsIqdoAGZi

如果您需要&#34;可更新频道&#34; - 只保留最后一个值,您可以使用此配方 - https://stackoverflow.com/a/47107654/5165332