竞争无处不在,青春永不言败!专业撸代码,副业修bug

Talk is cheap , show me the code!



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

posted @ 2021-10-06 22:54  云雾散人  阅读(332)  评论(0编辑  收藏  举报

Your attitude not your aptitude will determine your altitude!

如果有来生,一个人去远行,看不同的风景,感受生命的活力!