Golang 双向, 单向 channel 爬取 股票信息 chan <-, 解析 <-chan
channel 提供了一种通信机制, 定向 py, java 中的 消息队列
package main
import "fmt"
func main() {
// 定义一个 channel 用来通信 他是引用类型 默认 nil
var msg chan string // byte
// slice, map , channel 使用 make 进行初始化
msg = make(chan string) // 第一种初始化方式: 无缓冲
msg = make(chan string, 1) // 带缓冲空间
if msg != nil{
msg <- "frank"
}
data := <- msg
fmt.Println(data)
}
// 进一步学习
package main
import (
"fmt"
"sync"
)
func consumer(queue chan string){
defer wg.Done()
data := <- queue
fmt.Println(data)
}
var wg = sync.WaitGroup{}
func main() {
wg.Add(2)
var msg chan string = make(chan string, 1)
msg <- "frank"
go consumer(msg)
msg <- "tom"
go consumer(msg)
wg.Wait()
}
// for range 遍历 channel
package main
import (
"fmt"
"sync"
)
func consumer(queue chan string){
defer wg.Done()
for data:=range queue {
fmt.Println(data)
}
}
var wg = sync.WaitGroup{}
func main() {
wg.Add(1)
var msg chan string = make(chan string, 1)
msg <- "frank"
go consumer(msg)
msg <- "tom"
close(msg)
// msg <- "may" // send on closed channel
// 已经关闭的 channel 消费者端 还可以继续取数据,但是 发送端 不可以再发送数据
wg.Wait()
}
// 优雅写法
for {
data, ok := <- queue
if(!ok) {
break
}
fmt.Println(data)
}
msg := make(chan int, 1)
// 双向的 channel 这不就是双端队列???
var msg = make(chan<- int, 1) // 这就是只能往里面放值的 单向的channel
var msg <-chan int // 这就是只能从里面取值的 单向 channel
// 一般 只在 消费 / 生产 方法里 设置 单向的 chan, 主的还是 双向 chan
如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。