go 通道(channel)是用来传递数据的一个数据结构。
通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。
package main
import (
"fmt"
"time"
)
var c1 = make(chan string)
func input1() {
i := 0
for {
time.Sleep(time.Second)
i++
// 发送数据
c1 <- "out1"
fmt.Println("in:out1")
c1 <- "out2"
fmt.Println("in:out2")
}
}
func output1() {
for {
// 阻塞监听数据
x := <-c1
time.Sleep(time.Second)
fmt.Println("get:", x)
}
}
func main() {
go output1()
go input1()
for {
time.Sleep(time.Minute)
}
}
结果:
API server listening at: 127.0.0.1:37394
in:out1
get: out1
in:out2
get: out2
in:out1
get: out1
in:out2
get: out2
in:out1
get: out1
in:out2
get: out2
通过程序发现 发送端发送数据,同时必须有接收端相应的接收数据
然后有带缓冲区 通道 c1 := make(chan string, 10)
package main
import (
"fmt"
"time"
)
//改了这里
var c1 = make(chan string, 10)
func input1() {
i := 0
for {
time.Sleep(time.Second)
i++
// 发送数据
c1 <- "out1"
fmt.Println("in:out1")
c1 <- "out2"
fmt.Println("in:out2")
}
}
func output1() {
for {
// 阻塞监听数据
x := <-c1
time.Sleep(time.Second)
fmt.Println("get:", x)
}
}
func main() {
go output1()
go input1()
for {
time.Sleep(time.Minute)
}
}
结果:
API server listening at: 127.0.0.1:22705
in:out1
in:out2
in:out1
in:out2
get: out1
get: out2
in:out1
in:out2
in:out1
in:out2
get: out1
get: out2
in:out1
in:out2
in:out1
in:out2
get: out1
in:out1
in:out2
get: out2
get: out1
结论:
- 带缓冲区使用像队列一样
- 数据发送和接收端的数据获取处于异步状态
- 缓冲区的大小是有限制的,缓冲区一满,数据发送端就发送数据