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

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

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

一.channel

  • channel
  • buffered channel
  • range.由发送方结束发送
  • 理论基础:communication sequential process(csp)
  • 不要通过共享内存来通信;通过通信来共享内存
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()
}
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
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.net/111707.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月16日 下午8:00
下一篇 2022年2月16日 下午8:00


相关推荐

  • IdeaVim-常用操作「建议收藏」

    IdeaVim-常用操作「建议收藏」IdeaVim简介IdeaVim是IntelliJIDEA的一款插件,他提高了我们写代码的速度,对代码的跳转,查找也很友好。安装位置安装之后它在Tools>VimEmulator具体操作i模式i模式即为编辑模式,按下字母i开启就可以打字。Esc从i模式切换为Vim,按下键盘的Esc键切回Vim。方向键上:k,下:j,左:h,右:…

    2022年5月5日
    197
  • Java代码接入讯飞星火

    Java代码接入讯飞星火

    2026年3月14日
    2
  • 9008刷机 小米max2_小米Max2解锁教程_小米Max2一键解锁BL的方法「建议收藏」

    9008刷机 小米max2_小米Max2解锁教程_小米Max2一键解锁BL的方法「建议收藏」下面是咱们的小米Max2手机的解锁教程,也就是解锁BL的教程,在论坛里看到有机友在找相关的解锁操作,所以在这里整理了一下详细的解锁操作步骤供大家参考了,这个解锁是解锁BL,不是手机屏幕解锁,大家不要搞混了,只有解锁了BL之后手机才可以进行相关的root操作或者是刷机操作,如果你还不知道怎么进行解锁的话,就和迷你手机网一起来看看详细的解锁操作过程吧:下面是小米Max2详细的解锁步骤:1:然后到这个网…

    2022年5月29日
    111
  • 惊!我的 Redis 被挖矿脚本注入了

    惊!我的 Redis 被挖矿脚本注入了发现周五在个人服务器上新部署了redis做测试加了个几个key,过了个快乐周末,周一回来一看原key都没了,估计是用了flushall,而且多了这四个key。 k v backup1 */2****rootcd1-fsSLhttp://194.87.139.103/cleanfda/init.sh|sh backup2 */3****rootwget-q-

    2022年7月14日
    25
  • java2实用教程第六版习题答案

    java2实用教程第六版习题答案java2 实用教程第六版习题答案第一章一 判断题 二 单选题 BDACC 三 挑错题 DAB 第二题在书上无错误 但在习题库中 public 为 publlic 习题库中选 A 四 阅读程序题 1 Speak java 2 2 个 Speak classXiti4 class 3 Xiti4 4 在类 Speak 中找不到类方法之后的章节慢慢跟新 如果有错误希望能指出 我及时改正

    2026年3月20日
    2
  • c++析构函数

    c++析构函数分析 在 main 函数中创建了 t0 t1 t2 t3 几个对象 这里先说一下 C 创建对象的三种不同方式 1 Testp1 1 栈中分配内存 2 Testp2 Test 2 栈中分配内存 跟方法 1 相同 是方法 1 的完整模式 3 Test p3 newTest 3 堆中分配内存方法 1 2 中都是在栈中分配内存 在栈中内存由系统自动的去分配和释放 而使用 new 创建的指针对象是在堆中分

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号