golang管道channel顺序执行报错deadlock

当golang顺序执行时,会报错
fatal error: all goroutines are asleep - deadlock!

package main
import (
    "fmt"
)
func main() {
    ch := make(chan int)
    ch<-1
    c1 :=<-ch
    fmt.Println(c1)
}

不知道有没有跟我一样好奇,为什么下面读取了管道的内容,还是会报错呢,其实这样是因为对主程main而言,到ch<-1时,无法知道下面是否管道有读取数据,所以就会阻塞报错,可以在ch<-1上面加个go协程来处理,这也是为什么go协程写到ch<-1下面会报错的原因(当然用非阻塞也可以解决)
这么解释获取更专业一点:
通道ch在写入时,是同步等待接收端接收的状态,而接收的代码却在下一行,这个时候就导致了整个程序无法往下执行,造成死锁
解决方案:
起一个协程,使接受数据和发送数据并行执行
正确写法:

package main
import (
    "fmt"
)
func main() {
    ch := make(chan int)
    go t1(ch)
    ch<-1
}
func t1(ch chan int){
    fmt.Println("协程开始")
    c1 :=<-ch
    fmt.Println(c1)
}

注意下面这个go t1()位置,是错误的,原因就是main无法判断下面是否有管道ch数据读取

package main
import (
    "fmt"
)
func main() {
    ch := make(chan int)
    ch<-1
    go t1(ch) //ERROR:不可写在ch<-1后面
}
func t1(ch chan int){
    fmt.Println("协程开始")
    c1 :=<-ch
    fmt.Println(c1)
}

当然也可以给管道ch增加缓存区后,这样数据暂存到缓冲区,就不需要接收端同时接收数据了

//这个会阻塞报错锁错误(传的是<-ch1 此时已做了计算)
//一位同事说过:数传can,参数会优先计算结果放到堆栈里的
//另一位同事说:入参要先求值(个人觉得这个比较好理解)
func main() {
ch1 := make(chan int)
go fmt.Println(<-ch1)
ch1 <- 5
time.Sleep(1 * time.Second)
}
### Golang 在 VSCode 中运行时报错的解决方案 当在 VSCode 中运行 Golang 项目时,可能会遇到多种错误。以下是针对常见问题的具体解决方法: #### 1. **模块模式下的错误** 如果使用 Go Modules (mod) 模式开发,在调试过程中可能因环境变量未正确设置而导致错误。可以通过调整系统的 `GO111MODULE` 环境变量来修复此问题[^1]。 - 打开系统高级设置中的环境变量配置界面。 - 新增或修改名为 `GO111MODULE` 的环境变量,将其值设为 `auto` 或 `on`。 - 完成后重新启动 VSCode,使更改生效。 #### 2. **Go 工具链安装失败的问题** 部分开发者会在安装 Go 插件所需工具链时遭遇失败的情况。这通常是因为网络连接不稳定或其他原因引起的依赖项缺失。一种简单有效的办法是通过命令行强制更新工具集[^2]。 执行以下命令刷新本地缓存并重装必要组件: ```bash go install golang.org/x/tools/gopls@latest ``` 此外还可以尝试切换到国内镜像源加速下载过程,比如清华 TUNA 镜像站点提供的服务地址:https://mirrors.tuna.tsinghua.edu.cn/go/。 #### 3. **GOROOT 错误提示** 对于某些特定场景下报告 “package XXX is not in GOROOT”的情况,则需确认项目的 GOPATH 是否已正确定义于 launch.json 文件之中[^3]。 编辑 `.vscode/launch.json` 添加自定义路径参数作为工作区根目录的一部分: ```json { "version": "0.2.0", "configurations": [ { "name": "Launch Package", "type": "go", "request": "launch", "mode": "debug", "program": "${fileDirname}", "env": { "GOPATH": "/your/custom/path" }, "args": [] } ] } ``` 注意替换 `/your/custom/path` 成实际使用的文件夹位置字符串形式表示绝对路径。 完成上述操作之后再次测试程序能否正常编译与执行--- ### 总结 以上介绍了三种常见的关于 Golang 在 VSCode 下可能出现的异常状况及其对应的处理措施。每种情形都提供了具体的实施步骤以及辅助说明帮助理解原理所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值