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