图解golang的那些事儿
文章平均质量分 94
用最简单、最通俗的方式让大家了解Golang这门编程语言中包含的基本原理!保证让大家花五分钟的时间过目不忘!
优惠券已抵扣
余额抵扣
还需支付
¥29.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
菜刚
工作十年的互联网老兵。目前在百度,曾在NEC、新浪微博、贝壳找房等知名互联网公司从事研发工作。热爱技术,喜欢分享,习惯将工作生活中遇到的有趣的知识点写成blog,希望大家可以一起多多交流~
展开
-
图解Go引用的底层实现
Go怎么可能有引用?得了吧~有人要说了,那利用make()函数执行后得到的slice、map、channel等类型,不都是得到的引用吗?我要说:那能叫引用吗?你能确定啥叫引用吗?这一切要从变量说起。什么是变量无论是引用变量还是指针变量,都是变量;那么,什么叫变量?其实变量本质就是一块内存。通常,我们对计算机内存进行操作,最直接的方式就是“在0x0201地址内存一个整数100,在0x00202地址存一个浮点数10.6,读取0x00203的数据…” 这种方式让机器来操作还行,如果直接写成代码,这一堆原创 2021-07-24 14:26:02 · 30430 阅读 · 0 评论 -
细谈Go变量的内存分布
我们程序中的变量大多被分配在内存的两个区域:statck和heap。还记得一个进程的内存分配是怎么样的吗?我们一起来回顾一下:进程内存中的stack和heap我们写的程序代码跑起来后,会是一个进程;OS会给我们的进程分配内存;内存结构大致如下:OS给一个进程分配的内存空间大致可以分为:代码区、全局数据区、栈(stack)、堆(heap)、环境变量区域以及中间空白的缓冲区六个部分。其中,数据的增长路径除栈(stack)是由高到低之外,其余的均是由低到高(可看图中数据箭头)。我们思考一下,为什么栈(原创 2021-05-20 13:11:28 · 40398 阅读 · 3 评论 -
图解Go的unsafe.Pointer
相信看过Go源码的同学已经对unsafe.Pointer非常的眼熟,因为这个类型可以说在源码中是随处可见:map、channel、interface、slice…但凡你能想到的内容,基本都会有unsafe.Pointer的影子。看字面意思,unsafe.Pointer是“不安全的指针”,指针就指针吧,还安不安全的是个什么鬼?接下来,我们就来了解一下Go的这个“不安全的指针”unsafe.Poi...原创 2020-04-02 00:32:24 · 1086 阅读 · 0 评论 -
图解go反射实现原理
Go反射的实现和 interface和 unsafe.Pointer密切相关。如果对golang的 interface底层实现还没有理解,可以去看我之前的文章:Go语言interface...原创 2020-02-15 21:43:37 · 77159 阅读 · 0 评论 -
Golang非CSP并发模型外的其他并行方法总结
Golang最为让人熟知的当属CSP并发模型,也就是由goroutine和channel构成的[GMP并发模型](https://i6448038.github.io/2017/12/04/golang-concurrency-principle/),具体内容不在赘述了,可以翻回之前的文章查看。在这里,要讲讲Golang的其他并发方式。Golang不仅可以使用CSP并发模式,还可以使用传统的共...原创 2018-12-22 02:42:05 · 69586 阅读 · 0 评论 -
golang错题集
本文即Go语言的那些坑三。不要对Go并发函数的执行时机做任何假设请看下列的列子:import ( "fmt" "runtime" "time")func main()原创 2018-07-18 01:25:23 · 1132 阅读 · 2 评论 -
Golang奇葩点
本文即Go语言的那些坑二。Golang中函数被看做是值,函数值不可以比较,也不可以作为map的key请问以下代码能编译通过吗?import ( "fmt")func main(){ array := make(map[int]func ()int) array[func()int{ return 10}()] = func()int{ ...原创 2018-08-08 21:26:53 · 761 阅读 · 0 评论 -
Go语言的那些坑
Golang是我最喜欢的一门语言,它简洁、高效、易学习、开发效率高、还可以编译成机器码… 虽然它一出世,就饱受关注,而且现在在市面上逐渐流行开来,但是,它毕竟是一门新兴语言,还有很多让人不太习惯的地方(即坑,(^__^)),我作为新手,一边学习,一边踩坑,希望对其他人有借鉴作用。文件名字不要轻易以__test.go为结尾Golang的source文件的命名和其他语言本无差别,但是Gola...原创 2018-08-08 21:39:06 · 980 阅读 · 2 评论 -
快速理解Go数组和切片的内部实现原理
很多人对Go语言的array和slice傻傻分不清楚,今天我们就从底层出发,来聊聊它俩到底有什么区别。数组几乎所有计算机语言,数组的实现都是相似的:一段连续的内存,Go语言也一样,Go语言的数组底层实现就是一段连续的内存空间。每个元素有唯一一个索引(或者叫下标)来访问。如下图所示,下图是[5]int{1:10, 2:20}数组的内部实现逻辑图:由于内存连续,CPU很容易计算索引(即...原创 2018-08-12 20:12:19 · 77683 阅读 · 0 评论 -
解剖Go语言map底层实现
map是Go语言中基础的数据结构,在日常的使用中经常被用到。但是它底层是如何实现的呢? Golang中map的底层实现是一个散列表,因此实现map的过程实际上就是实现散表的过程。在这个散列表中,主要出现的结构体有两个,一个叫hmap(a header for a go map),一个叫bmap(a bucket for a Go map,通常叫其bucket)。这两种结构的样子分别如下...原创 2018-08-26 02:37:30 · 86128 阅读 · 24 评论 -
图解Go语言interface底层实现
Go的interface源码在Golang源码的runtime目录中。Go在不同版本之间的interface结构可能会有所不同,但是,整体的结构是不会改变的,此文章用的Go版本是1.11。Go的interface是由两种类型来实现的:iface和eface。其中,iface表示的是包含方法的interface,例如: type Example interface{ }...原创 2018-10-03 13:49:48 · 4904 阅读 · 1 评论 -
Go并发原理
Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数的开发者。并发(concurrency)和并行(parallellism)并发(concurrency):两个或两个以上的任务在一段时间内被执行。我们不必care这些任务在某一个时间点是否是同时执行,可能同时执行,也可能不是,我们只关心在一段时间内,哪怕是很短的时间(一秒或者两秒...原创 2019-03-05 10:59:03 · 69828 阅读 · 0 评论 -
图解Go select语句原理
Go 的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前的groutine。所以,有人也会说select是用来阻塞监听goroutine的。还有人说:select是Golang在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。以上说法都正确。I/O多路复...原创 2019-03-31 17:23:29 · 2038 阅读 · 0 评论 -
图解Golang的GC算法
虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了。以下是Golang GC算法的里程碑:v1.1 STWv1.3 Mark STW, Sweep 并行v1.5 三色标记法v1.8 hybrid write barrier经典的GC算法有三种:引用计数(reference counting)、标记-清扫(mar...原创 2019-03-10 22:53:33 · 18556 阅读 · 0 评论 -
图解Go的channel底层原理
废话不多说,直奔主题。channel的整体结构图简单说明:buf是有缓冲的channel所特有的结构,用来存储缓存数据。是个循环链表sendx和recvx用于记录buf这个循环链表中的发送或者接收的indexlock是个互斥锁。recvq和sendq分别是接收(<-channel)或者发送(channel <- xxx)的goroutine抽象出来的结构体(sudog)...原创 2019-04-14 22:26:34 · 19590 阅读 · 6 评论 -
图解Golang的内存分配
一般程序的内存分配在讲Golang的内存分配之前,让我们先来看看一般程序的内存分布情况:以上是程序内存的逻辑分类情况。我们再来看看一般程序的内存的真实(真实逻辑)图:Go的内存分配核心思想Go是内置运行时的编程语言(runtime),像这种内置运行时的编程语言通常会抛弃传统的内存分配方式,改为自己管理。这样可以完成类似预分配、内存池等操作,以避开系统调用带来的性能问题,防止每次分配内...原创 2019-06-09 20:11:07 · 78001 阅读 · 0 评论