V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
V2EX  ›  laowu2012  ›  全部回复第 3 页 / 共 51 页
回复总数  1003
1  2  3  4  5  6  7  8  9  10 ... 51  
2024 年 2 月 20 日
回复了 liaowb3 创建的主题 Go 编程语言 请问大家这里如何打印出“End. [sender]”
@AoEiuV020JP 抱歉抱歉
2024 年 2 月 19 日
回复了 liaowb3 创建的主题 Go 编程语言 请问大家这里如何打印出“End. [sender]”
我蛮帮你问了大模型,你试试看:

这段 Go 代码的主要问题是,它在等待一个信号来表明发送 goroutine 已经结束,但是这个信号从未被发送。当`sum`大于 3 时,接收循环会中断,但是发送 goroutine 会因为`intChan`的缓冲区已满而阻塞,导致无法到达打印`"End [SEND]"`的代码行。

要解决这个问题,你需要确保发送 goroutine 有机会发送完成信号。在这个场景中,你可以通过关闭`intChan`来实现,因为关闭一个通道会导致所有接收者收到一个零值,并且随后的接收都会立即返回零值,而不会阻塞。因为`intChan`是一个 int 类型的通道,接收者会得到一个`0`。

以下是修正后的代码,它确保了打印出`"End [SEND]"`:

```go
package main

import (
"fmt"
"time"
)

func main() {
intChan := make(chan int, 1)
ticker := time.NewTicker(time.Second)
done := make(chan struct{}) // 添加一个完成通道

go func() {
for range ticker.C {
select {
case intChan <- 1:
case intChan <- 2:
case intChan <- 3:
}
}
ticker.Stop() // 停止 ticker
close(intChan) // 关闭 intChan
fmt.Println("End [SEND]")
close(done) // 发送完成信号
}()

var sum int

for e := range intChan {
fmt.Printf("接收到 %d\n", e)
sum += e
if sum > 3 {
fmt.Println(sum)
break
}
}

fmt.Println("End [REC]")

<-done // 等待发送 goroutine 完成
}
```

这里做了以下改动:

1. 添加了一个`done`通道,用来接收发送 goroutine 完成的信号。
2. `ticker.Stop()`被调用来停止 ticker ,避免资源泄露。
3. 在发送循环结束后关闭`intChan`通道。
4. 打印`"End [SEND]"`后,关闭`done`通道来发送一个完成信号。
5. 在主函数的最后,添加`<-done`来等待发送 goroutine 完成。

现在程序会等待发送 goroutine 结束后,才结束`main`函数,确保`"End [SEND]"`被打印出来。请注意,这个版本的代码假设发送 goroutine 总是会结束,否则可能会导致死锁。在实际编程中,你可能需要添加超时或其他机制来处理这种情况。
2024 年 1 月 15 日
回复了 sickoo 创建的主题 iPhone 2024 了, ios 都在用什么输入法
微信输入法,自带双拼会卡机
我没有勇气整理统计
2023 年 12 月 26 日
回复了 fimoon 创建的主题 酷工作 temu 招聘跨境电商相关工程师、算法、bi 等
咨询个问题:Temu 到底如何发音?
>> 我姑父在厦门开了很多年棋校

国际象棋吗?
支持一下
2023 年 11 月 6 日
回复了 pclsm 创建的主题 职场话题 打开公司群,我惊呆了!
up 主没有 996
iij1EXOoxROfdZngES
2023 年 10 月 26 日
回复了 witcan 创建的主题 问与答 想看看还有多少人内网部署的项目管理系统还是 Redmine ?
爷青回
2023 年 9 月 21 日
回复了 luffy 创建的主题 Windows Edge 突然变模糊,不可用
从 Edge 换 Arc 一周了
2023 年 9 月 18 日
回复了 gdgoldlion 创建的主题 iPhone iPhone 15 买什么壳,介绍一下买壳经验
先裸奔,磕了再套壳
1  2  3  4  5  6  7  8  9  10 ... 51  
About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3291 Online   Highest 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 40ms · UTC 11:43 · PVG 19:43 · LAX 04:43 · JFK 07:43
♥ Do have faith in what you're doing.