Go异常总结

1.package 找不到

package project is not in GOROOT(E:\GO\download\WindowsX86\Go\src\project)

思路:
在这里插入图片描述
将GO111MODULE设置为off

go env -w GO111MODULE=off

2.管道死锁1

package main

import "fmt"

func main() {
	//定义一个管道
	var intChan chan int
	//通过make()方法进行初始化
	intChan = make(chan int) //无缓冲通道
	//管道为引用数据类型
	fmt.Printf("intChan => %v\n", intChan)
	//向管道中存数据
	intChan <- 1
	//从管道中取数据
	num2 := <-intChan //队列,取出来的应该是第一个存入的
	fmt.Printf("num2 => %v\n", num2)
}
fatal error: all goroutines are asleep - deadlock!

思路:
在接收者未准备好之前,发送操作是阻塞的。而此处的通道intChan就是缺少一个配对的接收者,因此造成了死锁。
解决上面问题的方式有两种:第一种添加配对的接收者;第二种将默认的通道替换成缓冲通道。
第一种:

package main

import "fmt"

func main() {
	//定义一个管道
	var intChan chan int
	//通过make()方法进行初始化
	intChan = make(chan int) //无缓冲通道
	//管道为引用数据类型
	fmt.Printf("intChan => %v\n", intChan)
	//向管道中存数据
	go func() {
		intChan <- 1
	}()
	//从管道中取数据
	num2 := <-intChan //队列,取出来的应该是第一个存入的
	fmt.Printf("num2 => %v\n", num2)
}

匿名函数用来发送数据,而在main()函数中接收通道中的数据。

第二种

package main

import "fmt"

func main() {
	//定义一个管道
	var intChan chan int
	//通过make()方法进行初始化
	intChan = make(chan int, 2) //定义为缓冲通道
	//管道为引用数据类型
	fmt.Printf("intChan => %v\n", intChan)
	//向管道中存数据
	intChan <- 1
	//从管道中取数据
	num2 := <-intChan //队列,取出来的应该是第一个存入的
	fmt.Printf("num2 => %v\n", num2)
}

3.管道死锁2
输入:

package main

import "fmt"

func main() {
	//定义一个管道
	var intChan chan int
	//通过make()方法进行初始化
	intChan = make(chan int) //定义为缓冲通道
	//管道为引用数据类型
	fmt.Printf("intChan => %v\n", intChan)
	//向管道中存数据
	go func() {
		fmt.Println(<-intChan) //接收者
	}()
	//从管道中取数据
	intChan <- 1 //发送者
	intChan <- 2 //发送者
}

输出:

intChan => 0xc0000161e0
1
fatal error: all goroutines are asleep - deadlock!

报错原因分析:
intChan <- 1 发送后有接收者, intChan <- 2 发送,无接收者

输入:

package main

import "fmt"

func main() {
	//定义一个管道
	var intChan chan int
	//通过make()方法进行初始化
	intChan = make(chan int) //定义为缓冲通道
	//管道为引用数据类型
	fmt.Printf("intChan => %v\n", intChan)
	//向管道中存数据
	go func() {
		intChan <- 1 //发送者
		intChan <- 2 //发送者
	}()
	//从管道中取数据
	fmt.Println(<-intChan) //接收者
}

输出:

intChan => 0xc000086060
1

分析:main()函数不会等待其他非main协程的结束
main()函数中 <-intChan 获取到 intChan <- 1 后直接结束了

4.发现做的一个demo中main()无法启动
发现是因为
指定包位置有问题
要执行main()进行编译
报位置必须指定package main

package main
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值