在Go语言中,当一个进程异常退出时,可能会导致Channel中的消息未被消费。为了解决这个问题,可以采用以下方法:
func main() {
ch := make(chan int)
go func() {
defer close(ch)
for i := 0; i < 10; i++ {
ch <- i
}
}()
for {
select {
case msg, ok := <-ch:
if !ok {
return
}
fmt.Println(msg)
}
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
ch <- i
}
}()
go func() {
wg.Wait()
close(ch)
}()
for msg := range ch {
fmt.Println(msg)
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
ch := make(chan int)
go func() {
defer close(ch)
for i := 0; i < 10; i++ {
select {
case ch <- i:
case <-ctx.Done():
return
}
}
}()
for {
select {
case msg, ok := <-ch:
if !ok {
return
}
fmt.Println(msg)
case <-ctx.Done():
return
}
}
cancel()
}
通过以上方法,可以确保在进程异常退出时,Channel中的消息得到正确处理。
领取专属 10元无门槛券
手把手带您无忧上云