go chan使用 匿名函数执行

//关于go语言协程通道的使用
//1.通道可以带缓存,也可以不带
//2.不带缓存的,不管是读还是写都会阻塞
//3.带缓存的,如果缓存溢出,就会阻塞
//4.make(chan int,1)和make(chan int)是不一样的,第一种通道内写入两个数据会阻塞,第二种写入就会阻塞
//5.如果协程在阻塞,但是主程已经退出执行,则认为程序死锁
//6.如果程序除了主程之外(没有一个协程),处于阻塞状态,则认为程序死锁
//7.一句话:只有一个协程(可以是主程),在阻塞,认为程序处于死锁
//8.子程序是协程的一种特例,阻塞到子程序执行完毕返回,而协程可能等不到执行完毕就返回,然后条件满足再回来执行

package main
import (
    "fmt"
)
func main() {
    //message := make(chan string)
    message := make(chan string, 1)
    msg := "hello"
    go func() {

        //      message <- msg
        //      fmt.Println("222")

        //      fmt.Println("msg2:", <-message)
        //      fmt.Println("1111111")

        select {
        case message <- msg:
            fmt.Println("message1")
            fmt.Println("msg2:", msg)

        default:
            fmt.Println("no message1.")
        }
    }()

    fmt.Println("msg1", <-message)

    select {
    case message <- msg:
        fmt.Println("message")
        fmt.Println("msg:", msg)

    default:
        fmt.Println("no message2.")
    }

    fmt.Println("msg3", <-message)
}

运行结果:
message1
msg2: hello
msg1 hello
message
msg: hello
msg3 hello

猜你喜欢

转载自blog.csdn.net/tovids/article/details/77858021