英文:
Can you make Golang drop packets on writes rather than block?
问题
在Go语言中,可以通过使用带有缓冲区的通道来实现你描述的功能。当通道的缓冲区未满时,你可以向通道写入数据;当通道的缓冲区已满时,你可以选择丢弃该数据包并处理下一个数据包。
以下是一个示例代码,演示了如何在Go语言中实现这个功能:
package main
import "fmt"
func main() {
// 创建一个长度为N的通道,其中N为你指定的长度
N := 10
ch := make(chan int, N)
// 向通道写入数据,只有当通道未满时才会成功写入
for i := 0; i < N+5; i++ {
select {
case ch <- i:
fmt.Println("写入数据:", i)
default:
fmt.Println("通道已满,丢弃数据:", i)
}
}
}
在上面的示例中,我们创建了一个长度为N的通道,并使用make
函数初始化它。然后,我们使用select
语句来尝试向通道写入数据。如果通道未满,写入操作将成功,并打印出写入的数据;如果通道已满,写入操作将被默认分支捕获,并打印出丢弃的数据。
希望这可以帮助到你!如果你有任何其他问题,请随时提问。
英文:
Given a channel of length N, I want to write to it only if it is not full. Else I will drop this packet and process the next one.
Is this possible in GOlang
答案1
得分: 18
你可以使用select
语句。示例代码如下:
package main
func main() {
ch := make(chan int, 2)
for i := 0; i < 10; i++ {
select {
case ch <- i:
// 处理这个数据包
println(i)
default:
println("满了")
// 跳过这个数据包并继续
}
}
}
select
语句用于在多个通信操作中选择一个可执行的操作。在示例代码中,通过select
语句将i
发送到通道ch
中。如果通道已满,则会执行default
分支,跳过当前数据包并继续循环。
英文:
You can use select
. Example:
package main
func main() {
ch := make(chan int, 2)
for i := 0; i < 10; i++ {
select {
case ch <- i:
// process this packet
println(i)
default:
println("full")
// skip the packet and continue
}
}
}
答案2
得分: 0
这是我写的辅助包中实现的OverflowingChannel
类型,虽然有点晚了,但它正是使用了上面提到的select技巧。
- 代码:https://github.com/eapache/channels
- 文档:https://godoc.org/github.com/eapache/channels
英文:
A bit after the fact I know, but this is exactly what is implemented by the OverflowingChannel
type in the helper package I wrote. It effectively uses the select trick above.
- Code: https://github.com/eapache/channels
- Documentation: https://godoc.org/github.com/eapache/channels
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论