使用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