登录
首页 >  Golang >  Go问答

如何打破僵局?

来源:stackoverflow

时间:2024-03-20 19:30:31 391浏览 收藏

在 Go 语言中,通过通道通信时,如果仅写入一个通道,但读取了多个值,则程序可能会陷入僵局。本文分析了一个程序,该程序试图使用通道来计算数字的平方根或三倍,并讨论了如何通过在 `case` 块中正确获取通道值来避免僵局。

问题内容

如果我写入第一个通道,则程序必须打印 num 的 sqrt,如果要写入第二个通道,则必须打印 3*num,如果要停止,则必须打印完成。我不明白频道在哪里被阻止。

package main

import (
"fmt"
)

func main() {
ch1, ch2 := make(chan int), make(chan int)
stop := make(chan struct{})

r := calculator(ch1, ch2, stop)

//ch1 <- 3
ch2 <- 2
//<-stop
fmt.Println(<-r)

}

func calculator(firstChan <-chan int, secondChan <-chan int, stopChan <-chan struct{}) <-chan int {
returnChan := make(chan int)
go func() {
    defer close(returnChan)
    select {
    case <-firstChan:
        returnChan <- (<-firstChan) * (<-firstChan)
    case <-secondChan:
        returnChan <- (<-secondChan) * 3
    case <-stopChan:
        close(returnChan)
    }
}()
return returnChan
}

正确答案


您正在阅读案例陈述:

case <-firstchan

在 case 块内:

...(<-firstchan) * (<-firstchan)

当只有一篇被发送到频道时,您总共读了三遍。

在 case 语句中获取 var 的值并在块中使用它,如下所示:

func calculator(firstChan <-chan int, secondChan <-chan int, stopChan <-chan struct{}) <-chan int {
    returnChan := make(chan int)
    go func() {
        defer close(returnChan)
        select {
        case firstChanVal := <-firstChan:
            returnChan <- firstChanVal * firstChanVal
        case firstChanVal := <-secondChan:
            returnChan <- firstChanVal * 3
        case <-stopChan:
            close(returnChan)
        }
    }()
    return returnChan
}

去玩地面演示

以上就是《如何打破僵局?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>