首页
AI Coding
NEW
沸点
课程
直播
活动
AI刷题
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
会员
登录
注册
Go
unitiny
创建于2022-10-01
订阅专栏
go的学习心得
等 7 人订阅
共19篇文章
创建于2022-10-01
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
Go defer的底层原理是怎样的?
前言 defer常用于锁的释放,连接关闭等场景,执行顺序是后进先出,靠后的defer先执行。那defer是怎么实现的呢? 实现思路 有两种思路: 由协程记录所有defer的执行代码,等return后调
Go GC是如何回收堆内存的?
前言 前情回顾: Go 堆内存结构是什么样的? Go 如何分配堆内存? 终于来到GC这块了。Go的GC是在运行程序时才工作的,并且是异步的,类似一个后台进程,不会打扰到其它协程的工作。那GC是怎么实现
Go 如何分配堆内存?
前言 前情回顾: Go 堆内存结构是什么样的? 我们在使用make,new函数时,都会涉及到堆内存的分配。那Go是如何分配堆内存的呢? 堆结构 简单回顾下堆结构: heapArena是一个64MB的堆
Go 堆内存结构是什么样的?
前言 Go中栈内存也是从堆内存中申请的,那堆内存是什么结构呢?堆内存如何分配内存呢? 操作系统内存结构 操作系统中,每个进程都有一个独立的巨大的虚拟内存,这些内存实际映射到物理内存上。而当物理内存空间
Go channel管道的运行原理
前言 Go推荐通过通信来共享内存,而channel就实现了这一理念。那channel是怎么运行的呢? 功能 举个例子看下channel的使用效果: 以上代码新建了一个缓冲区为8的管道,然后开启read
Go 瞧瞧WaitGroup
前言 WaitGroup常用于主协程等待一组goroutine完成,才继续下一步任务。其源码也较为简单,那不妨通过业务推导方式,自己梳理出实现逻辑,这样以后就靠推导而无需记忆实现原理了。 情景分析 使
Go 动手实操来了解Mutex互斥锁原理
前言 Mutex互斥锁是并发中最常见的锁,本篇分析下Mutex的运行机制,并通过测试解读源码。 锁结构 Mutex锁源码结构如下: Mutex结构体简单得令人惊讶,仅用两个字段就能实现互斥锁?其实里面
Go 底层锁:原子操作和sema信号量
前言 在Go开发中,我们会经常用到互斥锁,读写锁。而这些锁是基于更底层的锁来实现的。今天我们就来了解下原子操作和sema信号量,看它们能做些什么事情? 原子操作 用法 原子操作只支持简单的运算操作,比
Go 如何实现协程并发执行
前言 前情回顾: Go 了解协程 Go 深入考究协程 Go 多线程是如何运行协程的 Go 为什么要有GMP调度模型 前面我们讲解了线程是通过本地队列,全局队列或者偷其它线程的方式来获取协程的,目前看来
Go 为什么要有GMP调度模型
前言 前情回顾: Go 了解协程 Go 深入考究协程 Go 多线程是如何运行协程的 GMP调度模型是Go的精髓所在,它合理地解决了多线程并发调度协程的效率问题。 GMP是什么 首先得清楚,GMP各代指
Go 多线程是如何运行协程的
前言 前置知识: Go 了解协程 Go 深入考究协程 这一篇来讲解下Go中多线程是如何运行协程的,有什么问题需要解决。 单线程循环模型 Go中单线程执行协程的流程如下,业务方法块即是协程的代码,通过一
Go 老是忘记读写锁的实现怎么办
前言 读写锁是常用的几种锁之一,原理也很简单,读和读线程间不互斥,写和写线程间互斥,读和写线程间互斥。 但知道原理的我,每次想到读写锁是怎么实现时,就老是忘记,真让人头大。于是我决定通过源码分析之后,
Go 深入考究协程
前言 本篇幅介绍协程是如何在线程上运行的。 单线程循环结构 运行流程如下图,线程一直在跑一些函数,每一轮循环都会跳到一个协程并执行,执行完后又跳回线程继续循环,循环往复,其效果似协程在线程上运行一样。
Go 了解协程
为什么要用协程 我们经常会用到多线程去处理海量的请求,然而在Go中,是用多协程代替多线程去实现并发的。那协程和线程的区别是什么?Go中为什么要用协程呢? 协程和线程的区别 资源方面 linux及mac
Go 轻松了解内存对齐
前言 什么是内存对齐呢? 举个例子,64位系统每次读取都是8个字节,以下有一张图,存放着int16和int32大小的两个变量。 如果要加入一个int32大小的变量,正常情况下,会紧挨着内存摆放,便会出
Go 图解sync.Map
前言 无法并发的map map是程序员常用且喜爱的一种数据结构,能够实现读写为O(1)时间复杂度的功能,但可惜在Go中,map不能用于并发,在并发中使用会引发编译器的报错。 写个例子验证下: 上面程序
Go切片理解与性能分析
1 切片本质 因为操作灵活,可动态分配空间,使得我们在Go中经常使用切片。那么切片是怎么实现的呢? 1.1 数组 切片的实现是由数组抽象出来的。而数组具有以下性质 定义时已经固定了长度大小 内存中为一
Go逃逸分析
Go内存管理 go在程序运行时分配了不同的区空间来管理内存。 何为逃逸 go会将要执行的函数放入栈区,结束时会在栈区空间中释放,里面的局部变量也跟着释放。然而当该函数返回某个局部变量,并被外部函数调用
Go理解map实现,又get到了一个知识点
前言 map作为经典的元素集合方式,极大的方便了程序员的日常开发。在某个摸鱼时刻,咱忽然想到,map这么强大,读写才为O(1)时间复杂度的,它到底是怎么实现的呢? HashMap方案 常见的有两种方案