go-协程
go协程
1、在go中,协程包含了线程和协程
2、go中自动调度协程或线程来执行程序,能够充分利用多核优势,实现并发多线程
3、使用关键字go开启go协程
示例
func main() {
for i:=0;i<10000;i++{
go test()
}
time.Sleep(3*time.Second)
}
func test(){
time.Sleep(2*time.Second)
fmt.Println("测试go协程")
}
go协程间通信
信道:channel
信道是引用类型,零值为nil
go中,往信道中放数据和取数据都是阻塞机制,即放数据的时候,若放不进去,就会阻塞住,知道可以放进去;取数据也是一样,当取数据的时候,若取不到数据,就会阻塞住,直到可以取到数据
需要注意的是,这种阻塞态不会一直存在,当可以肯定一直放不进去或者取不到的时候,程序会抛出错误deadlock
无缓存信道
信道中不能缓存数据,往信道中放了数据,就必须有取数据的
// 引用类型数据,必须初始化才能使用
var c chan int = make(chan int) // 只能传输int类型的数据
var c chan interface{} = make(chan interface{}) // 可以传输任意类型的数据
可缓存信道
信道中可以存放一定量的数据
已经存放的数据个数叫做信道长度
可存放的最大数据个数叫做信道容量
// 信道容量为5的,可传输任意类型数据的信道
var c chan interface{} = make(chan interface{}, 5)
// 信道容量为5的,只能传输int数据的信道
var c chan int = make(chan int, 5)
示例
func main() {
var c chan interface{} = make(chan interface{}, 5)
go test1(c)
go test2(c)
go test2(c)
go test2(c)
time.Sleep(1*time.Second)
}
func test1(c chan interface{}){
c<-10
c<-"hello"
c<-"world"
c<-[]int{1,2,3}
}
func test2(c chan interface{}){
v := <-c
fmt.Printf("测试管道:获取数据%v", v)
}

浙公网安备 33010602011771号