前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Google资深工程师深度讲解Go语言-channel 通道 (十)

Google资深工程师深度讲解Go语言-channel 通道 (十)

作者头像
全栈程序员站长
发布2022-07-18 17:00:08
2040
发布2022-07-18 17:00:08
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是全栈君。

一.channel

  • channel
  • buffered channel
  • range.由发送方结束发送
  • 理论基础:communication sequential process(csp)
  • 不要通过共享内存来通信;通过通信来共享内存
代码语言:javascript
复制
package main

import (
	"fmt"
	"time"
)

func chanDemo() {
	c := make(chan int)
	go func() {
		for {
			n := <-c
			fmt.Println(n)
			//Output:
			// 1
			//2
		}
	}()
	c <- 1
	c <- 2
	time.Sleep(time.Microsecond)
}

func main() {
	chanDemo()
}
代码语言:javascript
复制
package main

import (
	"fmt"
	"time"
)

func worker(id int, c chan int) {
	for n := range c {
		//n := <-c //收数据
		//n, ok := <-c
		//if !ok {
		//	break
		//}

		fmt.Printf("worker %d received %d\n", id, n)

		//fmt.Println(n)
		//Output:
		// 1
		//2
	}

}
func createWorker(id int, ) chan<- int { //返回channel
	c := make(chan int)
	go worker(id, c)
	return c
}
func chanDemo() {
	//var c chan int //变量c 是个chanel 里面内容是int
	//c := make(chan int)

	var channels [10]chan<- int
	for i := 0; i < 10; i++ {
		channels[i] = createWorker(i)
	}

	for i := 0; i < 10; i++ {
		channels[i] <- 'a' + i
	}
	for i := 0; i < 10; i++ {
		channels[i] <- 'A' + i
	}

	//c <- 1  //发数据
	//c <- 2
	time.Sleep(time.Microsecond)
}

func bufferedChannel() {
	c := make(chan int, 3)
	go worker(0, c)
	c <- 'a'
	c <- 'b'
	c <- 'c'
	c <- 'd'
	time.Sleep(time.Microsecond)
}
func channelClose() { //发送方通知接收方
	c := make(chan int, 3)
	go worker(0, c)
	c <- 'a'
	c <- 'b'
	c <- 'c'
	c <- 'd'
	close(c)
	time.Sleep(time.Microsecond)
}
func main() {
	fmt.Println("channel ad first-class citizen")
	chanDemo()

	fmt.Println("Buffered channel")
	bufferedChannel()

	fmt.Println("Channel close and range")
	channelClose()
}

二.传统同步机制

  • waitGroup :等待组
  • Mutex 互斥
  • Cond
代码语言:javascript
复制
package main

import (
	"fmt"
	"sync"
	"time"
)

type atomicInt struct {
	value int
	lock sync.Mutex
}

func (a *atomicInt)increment()  {
	a.lock.Lock()
	defer a.lock.Unlock()
	a.value++
}

func (a *atomicInt)get()int  {
	a.lock.Lock()
	defer a.lock.Unlock()
	return a.value
}

func main() {
	var a atomicInt
	a.increment()
	go func() {
		a.increment()
	}()
	time.Sleep(time.Second)
	fmt.Println(a.get())
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/111707.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年2月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档