类似Queue
package main
import "fmt"
func main() {
var intChannel chan int
intChannel = make(chan int, 3)
fmt.Printf("intChannel:%v\n", intChannel)
fmt.Printf("&intChannel:%p\n", &intChannel)
// 向管道写入数据
intChannel <- 10
num := 100
intChannel <- num
intChannel <- 50
// 向管道写入数据时,不能超过其容量
//intChannel <- 98
fmt.Printf("length:%v, capacity:%v\n", len(intChannel), cap(intChannel)) // length:3, capacity:3
var num1 int
// 从管道读取数据
num1 = <-intChannel
fmt.Println(num1) // 10
fmt.Printf("length:%v, capacity:%v\n", len(intChannel), cap(intChannel)) // length:2, capacity:3
intChannel <- 98
fmt.Printf("length:%v, capacity:%v\n", len(intChannel), cap(intChannel)) // length:3, capacity:3
num1 = <-intChannel
fmt.Println(num1) // 100
// 取出,不接收
<-intChannel
fmt.Printf("length:%v, capacity:%v\n", len(intChannel), cap(intChannel)) // length:1, capacity:3
}
管道的关闭与遍历
func main() {
intChannel := make(chan int, 3)
intChannel <- 100
intChannel <- 200
// 关闭管道,关闭后不能写入,可以读取
//close(intChannel)
num := <-intChannel
fmt.Println("num:", num) // 100
intChannel <- 300
num = <-intChannel
fmt.Println("num:", num) // 200
intChannel <- 400
intChannel <- 500
// channel未关闭时遍历会出现deadlock错误,关闭后可以遍历
close(intChannel)
// 不能使用for循环来遍历
for value := range intChannel {
fmt.Println(value)
//300
//400
//500
}
}
主线程与协程 管道通信
package main
import (
"fmt"
"time"
)
func writeData(intChannel chan int) {
for i := 0; i < 10; i++ {
// 如果已经满了 会阻塞
intChannel <- i
fmt.Println("写入数据:", i)
time.Sleep(time.Second)
}
close(intChannel)
}
func readData(intChannel chan int, exitChannel chan bool) {
for {
// 从intChannel读取,没有数据则阻塞
v, ok := <-intChannel
if !ok {
break
}
fmt.Println("读取数据:", v)
time.Sleep(time.Second)
}
exitChannel <- true
close(exitChannel)
}
func main() {
intChannel := make(chan int, 10)
exitChannel := make(chan bool, 1)
fmt.Println("开始写")
go writeData(intChannel)
fmt.Println("开始读")
go readData(intChannel, exitChannel)
fmt.Println("主线程开始检查是否读取完成")
for {
// 从exitChannel中读取退出标志,如果没有标志则阻塞
_, ok := <-exitChannel
fmt.Println("主线程检查是否读取完成:", ok)
if ok {
break
}
}
}
开始写
开始读
主线程开始检查是否读取完成
读取数据: 0
写入数据: 0
读取数据: 1
写入数据: 1
写入数据: 2
读取数据: 2
写入数据: 3
读取数据: 3
写入数据: 4
读取数据: 4
写入数据: 5
读取数据: 5
写入数据: 6
读取数据: 6
写入数据: 7
读取数据: 7
写入数据: 8
读取数据: 8
写入数据: 9
读取数据: 9
主线程检查是否读取完成: true