go-channel

Golang
489
0
0
2022-11-08
默认情况下,管道式双向的
可读可写 var chan1 chan int
只读 var chan2 <-chan int
只写 var chan3 chan<- int
func main() {
    //演示一下管道的使用 
    //1. 创建一个可以存放 3 个 int 类型的管道 
    var intChan chan int
    intChan = make(chan int, 3)
    //2. 看看 intChan 是什么
    fmt.Printf("intChan 的值=%v intChan 本身的地址=%p\n", intChan, &intChan)
    //3. 向管道写入数据
    intChan<- 10
    num := 211
    intChan<- num
    intChan<- 50 
    // intChan<- 98//注意点, 当我们给管写入数据时,不能超过其容量 
    //4. 看看管道的长度和 cap(容量)
    fmt.Printf("channel len= %v cap=%v \n", len(intChan), cap(intChan)) // 3, 3

    //5. 从管道中读取数据 
    var num2 int
    num2 = <-intChan
    fmt.Println("num2=", num2)
    fmt.Printf("channel len= %v cap=%v \n", len(intChan), cap(intChan))
    // 2, 3 
    //6. 在没有使用协程的情况下,如果我们的管道数据已经全部取出,再取就会报告 deadlock
    num3 := <-intChan
    num4 := <-intChan
    num5 := <-intChan
    fmt.Println("num3=", num3, "num4=", num4, "num5=", num5)
}

var mapChan chan map[string]string
mapChan = make(chan map[string]string, 10)
m1 := make(map[string]string, 20)
m1["city1"] = "北京"
m1["city2"] = "天津"

m2 := make(map[string]string, 20)
m2["city1"] = "北京1"
m2["city2"] = "天津1"

mapChan <- m1
mapChan <- m2

fmt.Println(<-mapChan)
fmt.Println(<-mapChan)
>存放10个任意类型变量
var allChan chan interface{}
allChan = make(chan interface{}, 10)
cat1 := Cat{Name:"tom", Age: 10}
allChan<-cat1
allChan<-cat2
allChan<-10
allChan<-"jack"
明白了吗,chan 必须make后再使用,值类型必须是chan后面定义的类型,如果多种类型就使用interface{},泛型