Go内存分配那些事,就这么简单!

2019-09-09
阅读 14 分钟
19.4k
原文链接:[链接] 新老朋友好久不见,我是大彬,这篇文章准备了很久,不是在拖延,而是中间做了一些其他事情,耽搁了一些。 这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。 从非常宏观的角度看,Go的内存管理就是下图这个样子,我们今天主要关注其中标红的部分。 友情提醒:文章...

Go是如何实现protobuf的编解码的(2):源码

2019-09-09
阅读 24 分钟
9k
原文链接:[链接] 这是一篇姊妹篇文章,浅析一下Go是如何实现protobuf编解码的: Go是如何实现protobuf的编解码的(1): 原理 Go是如何实现protobuf的编解码的(2): 源码 本编是第二篇。 前言 上一篇文章Go是如何实现protobuf的编解码的(1):原理中已经指出了Go语言数据和Protobuf数据的编解码是由包github.com/golang/pr...

Go是如何实现protobuf的编解码的(1):原理

2019-09-09
阅读 7 分钟
9.1k
原文链接:[链接] 这是一篇姊妹篇文章,浅析一下Go是如何实现protobuf编解码的: Go是如何实现protobuf的编解码的(1): 原理 Go是如何实现protobuf的编解码的(2): 源码 本编是第一篇。 Protocol Buffers介绍 Protocol buffers缩写为protobuf,是由Google创造的一种用于序列化的标记语言,项目Github仓库:[链接]。 Protob...

实战Go内存泄露

2019-05-18
阅读 20 分钟
54.5k
最近解决了我们项目中的一个内存泄露问题,事实再次证明pprof是一个好工具,但掌握好工具的正确用法,才能发挥好工具的威力,不然就算你手里有屠龙刀,也成不了天下第一,本文就是带你用pprof定位内存泄露问题。

Go调度器系列(4)源码阅读与探索

2019-04-15
阅读 5 分钟
4.5k
各位朋友,这次想跟大家分享一下Go调度器源码阅读相关的知识和经验,网络上已经有很多剖析源码的好文章,所以这篇文章不是又一篇源码剖析文章,注重的不是源码分析分享,而是带给大家一些学习经验,希望大家能更好的阅读和掌握Go调度器的实现。

Go调度器系列(3)图解调度原理

2019-04-06
阅读 4 分钟
8.7k
如果你已经阅读了前2篇文章:《调度起源》和《宏观看调度器》,你对G、P、M肯定已经不再陌生,我们这篇文章就介绍Go调度器的基本原理,本文总结了12个主要的场景,覆盖了以下内容:

Go调度器系列(2)宏观看调度器

2019-03-27
阅读 5 分钟
4.2k
上一篇文章《Go语言高阶:调度器系列(1)起源》,学goroutine调度器之前的一些背景知识,这篇文章则是为了对调度器有个宏观的认识,从宏观的3个角度,去看待和理解调度器是什么样子的,但仍然不涉及具体的调度原理。

Go语言高阶:调度器系列(1)起源

2019-03-10
阅读 6 分钟
5k
如果把语言比喻为武侠小说中的武功,如果只是会用,也就是达到四五层,如果用的熟练也就六七层,如果能见招拆招也得八九层,如果你出神入化,立于不败之地十层。

深入理解channel:设计+源码

2019-03-04
阅读 3 分钟
7.7k
channel是大家在Go中用的最频繁的特性,也是Go最自豪的特性之一,你有没有思考过: Why:为什么要设计channel? What:channel是什么样的? How:channel是如何实现的? 这篇文章,就来回答这3个问题。 channel解决什么问题? 在Golang诞生之前,各编程语言都使用多线程进行编程,但多线程复杂、混乱、难以管理,对开发...

Go进阶:反射3定律

2019-02-25
阅读 3 分钟
4.4k
各位学习Go语言的朋友,周末好,这次跟大家聊一聊Go语言的一个高级话题:反射。 这篇文章是从我过去的学习笔记修改来的,内容主要来自Go Blog的一篇文章《The law of reflection》。 这篇文章主要介绍反射和接口的关系,解释内在的关系和原理。 反射来自元编程,指通过类型检查变量本身数据结构的方式,只有部分编程语言...

总结了才知道,原来channel有这么多用法!

2019-01-21
阅读 5 分钟
48.7k
这篇文章总结了channel的10种常用操作,以一个更高的视角看待channel,会给大家带来对channel更全面的认识。 在介绍10种操作前,先简要介绍下channel的使用场景、基本操作和注意事项。 channel的使用场景 把channel用在数据流动的地方: 消息传递、消息过滤 信号广播 事件订阅与广播 请求、响应转发 任务分发 结果汇总 ...

Golang并发:再也不愁选channel还是选锁

2019-01-14
阅读 4 分钟
28.6k
周末又到了,为大家准备了一份实用干货:如何使用channel和Mutex解决并发问题,利用周末的好时光,配上音乐,思考一下吧🤔。 来,问自己个问题:面对并发问题,是用channel解决,还是用Mutex解决? 如果自己心里还没有清晰的答案,那就读下这篇文章,你会了解到: 使用channel解决并发问题的核心思路和示例 channel擅长解...

Golang并发:除了channel,你还有其他选择

2019-01-05
阅读 6 分钟
8.5k
我们都知道Golang并发优选channel,但channel不是万能的,Golang为我们提供了另一种选择:sync。通过这篇文章,你会了解sync包最基础、最常用的方法,至于sync和channel之争留给下一篇文章。

Golang并发:一招掌握无阻塞通道读写

2018-12-27
阅读 4 分钟
27.3k
介绍Golang并发的模型写了几篇了,但一直没有以channel为主题进行介绍,今天就给大家聊一聊channel,channel的基本使用非常简单,想必大家都已了解,所以直接来个进阶点的:介绍channel的阻塞情况,以及给你一个必杀技,立马解决阻塞问题,实用性高。

Golang并发模型:轻松入门协程池

2018-12-20
阅读 2 分钟
13.6k
比如,我们有A、B两类工作,不想把太多资源花费在B类务上,而是花在A类任务上。对于A,我们可以来1个开一个goroutine去处理,对于B,我们可以使用一个协程池,协程池里有5个线程去处理B类任务,这样B消耗的资源就不会太多。

Golang并发模型:select进阶

2018-12-18
阅读 2 分钟
9.8k
最近公司工作有点多,Golang的select进阶就这样被拖沓啦,今天坚持把时间挤一挤,把吹的牛皮补上。 前一篇文章《Golang并发模型:轻松入门select》介绍了select的作用和它的基本用法,这次介绍它的3个进阶特性。 nil的通道永远阻塞 如何跳出for-select select{}阻塞 nil的通道永远阻塞 当case上读一个通道时,如果这个通...

Golang并发实践:笔记本秒变暖宝宝

2018-12-13
阅读 1 分钟
2.8k
早晨来到办公室,手是非常凉啊,一模笔记本,比手还凉,手指都快不能动了。歪脑筋一动,把笔记本编程暖手宝先暖暖手吧,这不就都暖和了。怎么变呢?当然是你学的Golang并发啦。

Golang并发模型:轻松入门select

2018-12-12
阅读 2 分钟
5.8k
之前的文章都提到过,Golang的并发模型都来自生活,select也不例外。举个例子:我们都知道一句话,“吃饭睡觉打豆豆”,这一句话里包含了3件事:

Golang并发模型:合理退出并发协程

2018-12-04
阅读 3 分钟
21.2k
goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞、panic、程序行为异常、数据结果不正确等问题。这篇文章介绍,如何合理的退出goroutine,减少软件bug。

Golang并发模型:轻松入门流水线FAN模式

2018-11-28
阅读 6 分钟
13.2k
前一篇文章《Golang并发模型:轻松入门流水线模型》,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Golang并发,提高软件性能。但FAN模式不一定是万能,不见得能提高程序的性能,甚至还不如普通的流水线。我们先介绍下FAN模式,再看看它怎么提升性...

Go并发模型:轻松入门流水线模型

2018-11-26
阅读 3 分钟
12.3k
Go作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,Go并发模型有多种模式,通过流水线模型系列文章,你会更好的使用Go的并发特性,提高的程序性能。

以太坊事件框架

2018-11-17
阅读 10 分钟
3.5k
过去在学Actor模型的时候,就认为异步消息是相当的重要,在华为的时候,也深扒了一下当时产品用的消息模型,简单实用,支撑起了很多模块和业务,但也有一个缺点是和其他的框架有耦合,最近看到以太坊的事件框架,同样简单简洁,理念很适合初步接触事件框架的同学,写文介绍一下。

以太坊源码分析:fetcher模块和区块传播

2018-11-17
阅读 35 分钟
4.1k
这篇文章从区块传播策略入手,介绍新区块是如何传播到远端节点,以及新区块加入到远端节点本地链的过程,同时会介绍fetcher模块,fetcher的功能是处理Peer通知的区块信息。在介绍过程中,还会涉及到p2p,eth等模块,不会专门介绍,而是专注区块的传播和加入区块链的过程。

以太坊源码分析:共识(3)Ethash

2018-11-17
阅读 4 分钟
2.6k
前言 Ethash实现了PoW,PoW的精妙在于通过一个随机数确定,矿工确实做了大量的工作,并且是没有办法作弊的。接下来将介绍: Ethash的挖矿本质。 Ethash是如何挖矿的。 如何验证Ethash的随机数。 Ethash的挖矿本质 挖矿的本质是找到一个随机数,证明自己做了很多工作(计算)。在Ethash中,该随机数称为Nonce,它需要满足...

以太坊源码分析:共识(2)引擎

2018-11-17
阅读 2 分钟
2.4k
前言 engine是以太坊封定义的一个接口,它的功能可以分为3类: 验证区块类,主要用在将区块加入到区块链前,对区块进行共识验证。 产生区块类,主要用在挖矿时。 辅助类。 接下来我们看一下engine具体定义了哪些功能,还有各功能的使用场景。 engine定义的具体功能 engine有3类功能,验证区块类、产生区块类、辅助类。因...

以太坊源码分析:共识(1)矿工

2018-11-17
阅读 2 分钟
3.4k
矿工在PoW中负责了产生区块的工作,把一大堆交易交给它,它生成一个证明自己做了很多工作的区块,然后将这个区块加入到本地区块链并且广播给其他节点。

Go依赖包管理工具,3分钟掌握govendor

2018-11-17
阅读 4 分钟
10.7k
网上写govendor的博文不少,但从安装到介绍,总看上去有些沉重,下面奉上一篇简单的教程,3分钟入门。 第1部分 简明教程 2步走,3分钟轻松搞定Go项目的依赖。 第1步 安装 {代码...} 第2步 为项目增加依赖 进入到项目目录 使用govendor init命令初始化项目的依赖 运行govendor fetch命令增加依赖 打开./vendor/vendor.jso...

你知道defer的坑吗?

2018-11-16
阅读 3 分钟
8.5k
你是不是觉得defer很简单、很好用,但也许你掉坑里了都不知道! 这篇文章不介绍defer的常用功能,而是介绍你在用defer时,也许会踩的坑。 defer允许我们进行一些函数执行完成后的收尾工作,并且代码更加简洁,例如: 关闭文件流: {代码...} 解锁一个加锁的资源 {代码...} 打印最终报告 {代码...} 关闭数据库链接 {代码....

Golang的WaitGroup陷阱

2018-11-16
阅读 2 分钟
9.1k
sync.WaitGroup是并发环境中,一个相当常用的数据结构,用来等待所有协程的结束,在写代码的时候都是按着例子的样子写的,也没用深究过它的使用。前几日想着能不能在协程中执行Add()函数,答案是不能,这里介绍下。

轻松检测Golang并发的数据竞争

2018-11-15
阅读 2 分钟
9k
Golang中我们使用Channel或者sync.Mutex等锁保护数据,有没有一种机制可以检测代码中的数据竞争呢? 背景知识数据竞争是并发情况下,存在多线程/协程读写相同数据的情况,必须存在至少一方写。另外,全是读的情况下是不存在数据竞争的。 使用race检测数据竞争 go build有个标记race可以帮助检测代码中的数据竞争。 {代码...