go channel初步

go 关键字跟随的函数,异步执行,并且可以阻塞,类似于js 的 async 函数中 await 异步结果

协程间通过 channel 传递信息,并且 channel 带有阻塞性,加上 go函数 的阻塞性,所以函数编写类似串行执行

但还是要注意是异步执行,结果出现的时间和串行不同。

package main

import(
    "fmt"
    "time"
)

var ch chan int = make(chan int,2);

func chPush(){
    fmt.Println("before push.")
    for i:=0;i<5;i++{
        // time.Sleep(100*time.Millisecond)
// 必须要读取以后,才能再压入一个。容量是2,所以一次可以压入2个数据
        ch <- i 
        fmt.Println("push:",i) 
    }
    fmt.Println("after push.")
}
func chPop(){
    fmt.Println("before pop.")
    for i:=0;i<5;i++{
        time.Sleep(100*time.Millisecond)


// 堵塞,必须要有数据,才能读取。另外,此处读取一个数据,chPush 会立即压入一个数据
  n := <- ch fmt.Println("pop:",n) } 


fmt.Println("after pop.")


}


func main(){


fmt.Println("begin:")


go chPush() // 异步,不会等待


fmt.Println("follow go push. no choke")


time.Sleep(1000 * time.Millisecond)


go chPop()


fmt.Println("follow go pop. no choke but delayed by sleep")


  // 主线程可能会先于子协程结束,所以要某种方式等待一下 
) 


}