使用channel实现goroutine
1.无缓冲channel
package main import ( "fmt" "time" ) var message = make(chan string) //往channel中输入信息 func sample1() { message <- "hello gorotine." } //消费channel中的信息 func sample2() { str := <- message str = str + " run fast,run the world." message <- str } func main() { go sample1() go sample2() time.Sleep(time.Second) fmt.Println(<-message) fmt.Println("message") }
2.buffer channel(缓冲channel)
package main import ( "fmt" "time" ) /* 1.buffer channel 2.在函数中传递channel,而不是申明一个全局变量channel 3.FIFO:first input first output */ //往channel中输入信息 func sample1(message chan string) { message <- "hello gorotine.1" message <- "hello gorotine.2" message <- "hello gorotine.3" message <- "hello gorotine.4" } //消费channel中的信息 func sample2(message chan string) { str := <- message str = str + " run fast,run the world." message <- str } func main() { var message = make(chan string, 4) go sample1(message) go sample2(message) time.Sleep(time.Second) fmt.Println(<-message) fmt.Println(<-message) fmt.Println(<-message) //fmt.Println(<-message) fmt.Println("message") }
// 2.1 output1 hello gorotine.2 hello gorotine.3 hello gorotine.4 message
取消这行代码的注释//fmt.Println(<-message),将会得到如下的输出,这正好说明了先进先出的概念
//2.2 output2 hello gorotine.2 hello gorotine.3 hello gorotine.4 hello gorotine.1 run fast,run the world. message
3.遍历channel及关闭遍历channel
package mainimport ( "fmt" "time")/* 1.buffer channel 2.在函数中传递channel,而不是申明一个全局变量channel 3.FIFO:first input first output *///往channel中输入信息func sample1(message chan string) { message <- "hello gorotine.1" message <- "hello gorotine.2" message <- "hello gorotine.3" message <- "hello gorotine.4"}//消费channel中的信息func sample2(message chan string) { str := <- message str = str + " run fast,run the world." message <- str}func main() { var message = make(chan string, 4) go sample1(message) go sample2(message) time.Sleep(time.Second) //使用range遍历channel for str := range message { fmt.Println(str) } fmt.Println("message")}
不关闭channel,那么channel默认为空;那此时如果遍历,则会抛出异常
//3.1output1hello gorotine.2hello gorotine.3hello gorotine.4hello gorotine.1 run fast,run the world.fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.main() D:/run/pms/src/test.go:37 +0x126
下面演示关闭channel的遍历
package mainimport ( "fmt" "time")/* 1.buffer channel 2.在函数中传递channel,而不是申明一个全局变量channel 3.FIFO:first input first output *///往channel中输入信息func sample1(message chan string) { message <- "hello gorotine.1" message <- "hello gorotine.2" message <- "hello gorotine.3" message <- "hello gorotine.4"}//消费channel中的信息func sample2(message chan string) { str := <- message str = str + " run fast,run the world." message <- str close(message)}func main() { var message = make(chan string, 4) go sample1(message) go sample2(message) time.Sleep(time.Second) //使用range遍历channel for str := range message { fmt.Println(str) } fmt.Println("message")}
//3.2output2hello gorotine.2hello gorotine.3hello gorotine.4hello gorotine.1 run fast,run the world.message
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。