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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 方法重载和重写的区别[通俗易懂]

    方法重载和重写的区别[通俗易懂]一、方法重载(overload)重载方法的定义是在同一个类中,某方法允许存在一个以上的同名方法,只要它们的参数列表不同即可。方法重载的作用:屏蔽了同一功能的方法由于参数不同所造成方法名称不同。方法重载判断原则: “两同一不同”两同:同类中,方法名相同;一不同:方法参数列表不同(参数类型、参数个数、参数顺序);       只要参数类型,参数个数,参数顺序有一个不同,参数列表就不同.注意:方法重载和…

    2022年6月13日
    28
  • WEbService服务端-用Axis客户端测试遇到的问题Exception in thread “main“ AxisFault

    WEbService服务端-用Axis客户端测试遇到的问题Exception in thread “main“ AxisFaultExceptioninthread”main”AxisFaultfaultCode:{http://schemas.xmlsoap.org/soap/envelope/}Server.userExceptionfaultSubcode:faultString:org.xml.sax.SAXParseException:Prematureendoffile.

    2025年11月2日
    3
  • Java 多线程(超详细)

    Java 多线程(超详细)多线程学习思路:为什么学习线程?为了解决CPU利用率问题,提高CPU利用率。=》什么是进程?什么是线程?=》怎么创建线程?有哪几种方式?有什么特点?=》分别怎么启动线程?=》多线程带来了数据安全问题,该怎么解决?=》怎么使用synchronized(同步)决解?=》使用同步可能会产生死锁,该怎么决解?=》线程之间是如何通信的?=》线程有返回值吗?该如何拿到?=》怎么才能一次性启动几百上千个的线程?线程的概念什么是进程进程是操作系统中正在执行的不同的应用程序,例如:我

    2022年7月9日
    21
  • android-studio安装及android开发环境搭建[通俗易懂]

    android-studio安装及android开发环境搭建[通俗易懂]android-studio安装及android开发环境搭建版本信息版本作者时间备注v1.0ZY2019.2.9初稿目录文章目录android-studio安装及android开发环境搭建版本信息目录一、下载准备二、安装三、配置及测试1、首次配置2、测试3、创建虚拟机运行(1)正常运行(2)启动失败的问题及解决方案a、检测虚拟化b、AMD的CPU使用虚拟…

    2022年7月23日
    12
  • 常用快捷键大全「建议收藏」

    常用快捷键大全「建议收藏」一、系统快捷键F1帮助F2改名F3搜索F4地址F5刷新F6切换F8安全模式F10菜单F11全屏INS插入模式PRTSCSYSRQ截屏CAPSLOCK大写字母锁定DELETE

    2022年8月3日
    4
  • java迭代和 递归的异同_递归和迭代有什么区别?简述区别

    java迭代和 递归的异同_递归和迭代有什么区别?简述区别你对于递归和迭代都了解吗?那么你是否知道递归和迭代的区别呢?那么下面就和小编一起来了解一下,这两者之间的区别究竟是怎样的吧!一、递归和迭代区别首先我们要讲到的就是两者之间的概念。首先,程序调用自身的编程技巧叫做递归,函数自己调用自己。一个函数在它的定义当中,直接或者是间接的调用自身的一种方法。它经常将一个大型的复杂的问题转化为一个和原来的问题相似的但是规模较小的问题来解决。这样能够极大的减小代码量…

    2022年5月3日
    50

发表回复

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

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