TreeviewCopyright © aleen42 all right reserved, powered by aleen42

chan

关闭的chan意味着什么呢,就是不能继续写入了,但读取时没有问题的,如果没有会返回默认值,如果需要判断可以通过ok语法

package main

import "fmt"

func main() {
    ch := make(chan string,1)
    ch <- "sbc"
    close(ch)
    //for c := range ch{
    //    fmt.Println(c)
    //}
    a,ok := <-ch
    fmt.Println(a,ok)

    b,ok := <-ch
    fmt.Println(b,ok)

    c,ok := <-ch
    fmt.Println(c,ok)
}

输出:

sbc true
 false
 false

当然写入报错。

长度

    ch := make(chan int ,100)
    ch <-1
    ch<-1
    fmt.Println(len(ch),cap(ch))

输出的结果是:

2 100

长度是里面元素的个数,cap是容量,只有容量超的时候才会阻塞

下面的代码是有问题,协程是没法停止的

package main

import (
    "time"
    "fmt"
    "runtime"
)

func main() {

    ch := make(chan int)
    go func() {
        time.Sleep(time.Second*6)
        ch <-1
    }()


    select {
    case <- ch:
        fmt.Println("over")
    case <- time.After(3*time.Second):
        fmt.Println("timeout")

    }

    for{
        time.Sleep(time.Second *1)
        fmt.Println(runtime.NumGoroutine())
    }

}

func app(s *[]byte){
    *s = append(*s,'d','e','f')
}

在程序协程执行完由于管道没有空间会一直阻塞,协程会卡住 需要将代码如下修改

    ch := make(chan int,1)

这个在编程的时候容易忽视

results matching ""

    No results matching ""