gpt4 book ai didi

使用 select 时转到 channel 丢失偶数

转载 作者:数据小太阳 更新时间:2023-10-29 03:30:35 27 4
gpt4 key购买 nike

我正在使用此函数获取从 0 到 100 的数字。

func addone(c chan int) {
for i:= 0; i <= 100; i++{
c <- i
}
close(c)
}

然后我尝试输出它:

func printone(c chan int) {
for {
select {
case <-c:
fmt.Println(<-c)
time.Sleep(time.Millisecond * 50)
default:
fmt.Println("dropped")
}
}
}

主要功能:

func main() {
ch := make(chan int)
go addone(ch)
printone(ch)
}

go channel 在使用select 时缺少偶数,例如输出:

掉落1个3个5个7911131517192123252729313335373941434547495153555759616365676971737577798183858789919395979900

2、4、6、8 等在哪里?

为什么在关闭 channel 后它向 c channel 发送零?我认为它会等待新数据进入并获得“默认”案例?

最佳答案

这是因为您正在从 channel 中读取两次。

首先尝试将 channel 数据分配给一个变量。

这是一个例子:https://play.golang.org/p/ZdSOPe1Gj13

package main

import "time"
import "fmt"

func main() {

// For our example we'll select across two channels.
c1 := make(chan string)
c2 := make(chan string)

// Each channel will receive a value after some amount
// of time, to simulate e.g. blocking RPC operations
// executing in concurrent goroutines.
go func() {
time.Sleep(1 * time.Second)
c1 <- "one"
}()
go func() {
time.Sleep(2 * time.Second)
c2 <- "two"
}()

// We'll use `select` to await both of these values
// simultaneously, printing each one as it arrives.
for i := 0; i < 2; i++ {
select {
case msg1 := <-c1:
fmt.Println("received", msg1)
case msg2 := <-c2:
fmt.Println("received", msg2)
}
}
}

关于使用 select 时转到 channel 丢失偶数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52195621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com