package main
import (
"fmt"
"time"
)
var c chan int
func ready(w string, sec int) {
time.Sleep(time.Duration(sec) * time.Second)
fmt.Println(w, "is ready")
//往channel中插入数据
c <- 1
}
//有缓冲的channel:这里有个缓冲,因此放入数据的操作c<- 0先于取数据操作 <-c
var a string
var c1 = make(chan int, 10)
func f() {
a = "hello world"
c1 <- 0
}
//无缓冲的channel:由于c是无缓冲的channel,因此必须保证取操作<-c 先于放操作c<- 0
var a2 string
var c2 = make(chan int)
func f2() {
a2 = "hellow my world"
<-c2
}
func main() {
//Go语言提供的消息通信机制被称为channel "不要通过共享内存来通信,而应该通过通信来共享内存。"
//channel是Go语言在语言级别提供的goroutine间的通信方式。channel是类型相关的chan声明,var chanName chan ElementType 并使用直接使用内置的函数make()创建即可: ch := make(chan int)
c = make(chan int)
go ready("Tee", 2)
go ready("Coffee", 1)
fmt.Println("i am waiting,but not too long")
//从channel中输出数据
<-c
<-c
go f()
<-c1
fmt.Println(a)
go f2()
c2 <- 0
fmt.Println(a2)
}
//channel分为两种:一种是有buffer的,一种是没有buffer的,默认是没有buffer的
//ci := make(chan int) //无buffer
//cj := make(chan int, 0) //无buffer
//cs := make(chan int, 100) //有buffer
//有缓冲的channel,因此要注意“放”先于“取”
//无缓冲的channel,因此要注意“取”先于“放”
//关于channel的四个特性
//1.给一个 nil channel 发送数据,造成永远阻塞.2.从一个 nil channel 接收数据,造成永远阻塞.3.给一个已经关闭的 channel 发送数据,引起 panic.4.从一个已经关闭的 channel 接收数据,立即返回一个零值