写一个简单的程序,使得一个协程用来向channel中写如数据,一个用来读取数据。git
import ( "fmt" "strconv" "testing" ) /** 在这个示例中,咱们有 - 一个message做为channel - 一个协程用来发送消息 - 主协程用来接收消息 */ func Test_message(t *testing.T) { /** 声明一个长度为 1 的channel */ messages := make(chan string) /** 该协程负责向channel发送数据,共发送五次 */ go func() { for i := 0; i < 5; i++ { messages <- "Hello, 这是第 " + strconv.Itoa(i) + " 次传递消息" } }() /** 读取channel中的数据,这是个阻塞的操做 */ for i := 0; i < 5; i++ { fmt.Println(<- messages) } }
而后下面是三段代码,你们看以前能够小思考下运行结果,最好本身动手测试下。github
import ( "fmt" "strconv" "testing" "time" ) /** 在这个示例中,咱们的副协程在向channel中写入数据的时候,有一秒的延迟 而后咱们发现控制台断断续续的打印出了内容 说明咱们从channel中读取消息是个阻塞的行为 */ func Test_message1(t *testing.T) { /** 声明一个长度为 1 的channel */ messages := make(chan string) /** 该协程每隔一秒向channel发送一个数据 */ go func() { for i := 0; i < 5; i++ { time.Sleep(time.Second * 1) messages <- "Hello, 这是第 " + strconv.Itoa(i) + " 次传递消息" } }() /** 读取channel中的数据,这是个阻塞的操做 */ for i := 0; i < 5; i++ { fmt.Println(<- messages) } }
固然是阻塞的,写协程阻塞了,读协程只能干等着啊,这个问题好像有点(๑•ᴗ•๑)缓存
import ( "fmt" "strconv" "testing" "time" ) /** 在这个示例中,咱们向channel中读取数据时,设置了一秒的延迟 而后咱们发现控制台断断续续的打印出了内容 说明咱们向channel中写入消息也是是个阻塞的行为 它受到channel容量的限制,若是channel容量满了,写操做就会阻塞协程 */ func Test_message2(t *testing.T) { /** 声明一个长度为一的channel */ messages := make(chan int) /** 该协程每隔一秒向channel发送一个数据 */ go func() { for i := 0; i < 5; i++ { messages <- i fmt.Println("Hello, 这是第 " + strconv.Itoa(i) + " 次传递消息") } }() /** 读取channel中的数据,这是个阻塞的操做 */ for i := 0; i < 5; i++ { <- messages time.Sleep(time.Second * 1) } }
答案是会的,由于channel的容量是有限的,没有消费者的话,生产者是不能继续生产的。测试
import ( "fmt" "strconv" "testing" "time" ) /** 在这个示例中,咱们建立了一个有缓存channel 你们能够自行执行如下,能够看到前面6次打印很是快,后面三次则是断断续续的 这就是有缓冲的channel,即便没有消费者,咱们依旧能够向channel中写入数据, 直到容量达到上限 */ func Test_message3(t *testing.T) { /** 声明一个容量为5的channel */ messages := make(chan int, 5) /** 该协程持续的尝试向channel中发送一个数据 */ go func() { for i := 0; i < 10; i++ { messages <- i fmt.Println("Hello, 这是第 " + strconv.Itoa(i) + " 次传递消息") } }() /** 每隔一秒读取一次channel中的数据,这是形成channel内元素逐渐累积 */ for i := 0; i < 5; i++ { <- messages time.Sleep(time.Second * 1) } }
答案是前面6次打印很是快,后面三次则是断断续续的code
怎么样,是否是对协程和channel有了基本的认识了协程