go语言
文章平均质量分 86
编程宝库
关注软件工程实践,百度架构师。
展开
-
Java将增加虚拟线程,挑战Go协程
我们知道 Go 语言最大亮点之一就是原生支持并发,这得益于 Go 语言的协程机制。一个 go 语句就可以发起一个协程 (goroutin)。协程本质上是一种用户态线程,它不需要操作系统来进行调度,而是由用户程序自行管理和调度。它寄存于线程中,系统开销极小,可以显著的提高性能和并发能力。使用协程的优点是运行效率高、编程简单、结构清晰。目前,原生支持协程的语言不是很多。Oracle 本周提交的一份JDK增强建议(JEP)草案要求将虚拟线程作为Java标准版的一部分进行预览。虚拟线程类似于 Go 语言的协程原创 2021-11-19 09:21:03 · 441 阅读 · 0 评论 -
Go iota 原理和源码剖析
iota 是 Go 语言的一个保留字,用作常量计数器。由于 iota 具有自增特性,所以可以简化数字增长的常量定义。iota 是一个具有魔法的关键字,往往令初学者难以理解其原理和使用方法。本文会从书写方法、使用场景、实现原理以及优缺点等各方面剖析 iota 关键字。1. 书写方法正确写法:const ( FirstItem = iota SecondItem ThirdItem)// 或者const SingleItem = iota错误写法:var FirstItem =原创 2021-11-17 12:13:49 · 304 阅读 · 0 评论 -
Go defer 特性和使用场景
golang 的 defer 语句用于延迟调用。defer 会在当前函数返回之前执行 defer 注册的函数。比如 defer func_defer() 这样语句会让你注册一个函数变量到 defer 的全局链表中,在 defer 语句所在的函数退出之前调用。defer 可以代替其它语言中 try…catch… 语句,也可以用来处理释放资源等收尾操作,比如关闭文件句柄、关闭数据库连接等。defer 还能用于 panic 的 recovery。1. defer 的特性我们先深入的剖析下 defer 具有的原创 2021-11-15 16:43:02 · 351 阅读 · 0 评论 -
Go defer 原理和源码剖析
Go 语言中有一个非常有用的保留字 defer,defer 语句可以调用一个函数,该函数的执行被推迟到包裹它的函数返回时执行。defer 语句调用的函数,要么是因为包裹它的函数执行了 return 语句,到达了函数体的末端,要么是因为对应的 goroutine 发生了 panic。在实际的 go 语言程序中,defer 语句可以代替其它语言中 try…catch… 的作用,也可以用来处理释放资源等收尾操作,比如关闭文件句柄、关闭数据库连接等。1. 编译器编译 defer 过程defer dosome原创 2021-11-12 14:47:38 · 1079 阅读 · 0 评论 -
Go语言并发模型 G源码分析
Go 的线程实现模型,有三个核心的元素 M、P、G,它们共同支撑起了这个线程模型的框架。其中,G 是 goroutine 的缩写,通常称为 “协程”。关于协程、线程和进程三者的异同,可以参照 “进程、线程和协程的区别”。每一个 Goroutine 在程序运行期间,都会对应分配一个 g 结构体对象。g 中存储着 Goroutine 的运行堆栈、状态以及任务函数,g 结构的定义位于 src/runtime/runtime2.go 文件中。g 对象可以重复使用,当一个 goroutine 退出时,g 对象会被原创 2021-11-09 15:34:30 · 733 阅读 · 0 评论 -
Go1.17 新特性:为什么能够使程序提速
在 Go1.17 发布后,我们惊喜的发现 Go语言 又又又优化了,编译器改进后产生了约 5% 的性能提升,也没有什么破坏性修改,保证了向前兼容。他做了些什么呢,好像没怎么看到有人提起。为此今天煎鱼带大家来解读两新提案:《Proposal: Register-based Go calling convention》《Proposal: Create an undefined internal calling convention》本文会基于提案讲解和拆解,毕竟分享新知识肯定要从官方资料作为事实基准出原创 2021-09-01 14:24:48 · 506 阅读 · 1 评论 -
Go 结构体方法指针和值的区别
众所周知,Go struct 定义方法时使用指针还是值的区别就是在方法内修改属性值时,用值定义的方法所做的修改只限于方法内,而指针则没有这个局限。文章如果到这里就结束了,那么就很平平无奇了,于是我打算带大家去做个无聊但是值得思考的实验。在开始之前,先写段简单的代码跑一下前面说到的东西,顺便让大家熟悉一下接下来实验代码的一些编码规则,哦对了,以下代码写于 2021.08,Go 版本是 1.16.5,如果你看到这篇文章的时候 Go 已经更新了很多个版本了,可能就不适用了。废话不多说,上代码:package原创 2021-08-31 11:20:22 · 1138 阅读 · 0 评论 -
进程、线程和协程的区别和联系
在面试中,经常会有面试官问题“进程、线程和协程的区别”这个问题,这也是大学课程操作系统中最基本的知识。我们通常对此都说上几句,但细节又不是特别深入明了。我整理了一下相关的内容,加上自己的理解,与君共享。1. 进程1.1 定义 进程是计算机中程序的一次运行活动,是操作系统进行资源分配和调度的基本单位。每一个进程都拥有自己的地址空间,一般包括代码段、数据段、堆和栈。其中,代码段用来存放处理器执行的代码;数据段存放全局和静态变量;堆用来存放动态分配的内存;栈用来存放局部变量、函数参数和寄存器的值等。1原创 2020-11-08 07:46:26 · 301 阅读 · 0 评论 -
微服务 · 如何进行服务限流和熔断
一、服务雪崩 微服务架构是将单个应用程序被划分成各种小而连接的服务,每一个服务完成一个单一的业务功能。相对于传统的单体服务,微服务具有隔离性、技术异构性、可扩展性以及简化部署等优点。通常一个应用由多个微服务组成,微服务之间的数据交互需要通过远过程调用的方式完成。 下图是一个微服务之间互相调用的场景: 微服务A调用微服务B、C和D,微服务C又调用微服务E。假设某一时刻,微服务E变为不可用。微服务C需要等待微服务E返回结果,于是请求就会逐渐堆积在微服务C,形成阻塞。随着微服务C堆积的请求不断原创 2020-11-07 10:36:38 · 1237 阅读 · 2 评论