
Golang
文章平均质量分 58
Pekue
这个作者很懒,什么都没留下…
展开
-
Golang 字符串拼接
Golang字符串拼接效率对比原创 2022-07-19 17:42:20 · 462 阅读 · 0 评论 -
Golang 栈内存与堆内存
Golang 栈内存 堆内存 内存逃逸原创 2022-05-25 14:16:12 · 1218 阅读 · 0 评论 -
Go语言的函数调用栈
函数栈帧我们知道,Golang可以把程序直接编译成.exe可执行文件,运行时,可执行文件被加载到内存,这些个机器指令对应到虚拟地址空间中,位于代码段(虚拟地址空间分别有:栈、堆、数据段、代码段)。在这其中,如果在一个函数调用另一个函数,编译器就会对应生成一条call指令,每个函数最后都有一条ret指令,负责函数结束后跳回到调用处。函数执行时,需要有足够的空间存放局部变量、参数、返回值等信息,这段空间对应虚拟地址空间中的栈。分配给函数的空间叫做函数栈帧,这就是咱们的主角了。栈底通常叫栈基bp,栈顶又叫原创 2021-06-02 16:26:29 · 527 阅读 · 0 评论 -
Go语言的Map
哈希表说到Map,键值对的存储,我们就会想到哈希表,哈希表通常会有一堆桶来存储键值对,一个键值对来了,就根据哈希规则选择一个桶,选择的桶冲突的话,就使用开放地址法、链表法等来处理冲突,这些都都比较简单,我就先不写到这块了。关键字段Map的底层实现就是哈希表,map类型变量本质上是一个指针,指向hamp结构体,其中关键的字段有:count(int):键值对数目B(uint8):记录桶(用来存放map)的数目2^Bbuckets(unsafe.Pointer):记录桶的位置oldbucket原创 2021-06-02 14:59:48 · 178 阅读 · 0 评论 -
关于内存对齐与其在GO中应用
嘛是内存对齐?为了保持顺序高效的读取各种数据,编译器会把各种类型的数据排列到合适的地址,并占用合适的长度,这,就是内存对齐。不同类型的对齐边界不同类型有不同的大小,自然会有不同的对齐边界,比如int16占用两个字节,对齐边界就是2,int32占用四个字节,对齐边界就是4,那么在奇数个int16后是不能紧跟int32的,因为这样是无法便捷快速的找到int32这个类型对应的数据。解决办法是往后空2个字节,这个空2个字节怎么算出来的呢?就是要算出当前的地址是否可以整除你的对其边界。不同的系统和语言中原创 2021-06-02 14:44:32 · 146 阅读 · 0 评论 -
Go语言的Slice
Slice结构主要包含三个部分:地址、长度、容量基础结果Slice一般都会依赖一个底层数组(数组和切片的最主要区别数组长度不可变;切片长度可变),通过make得到的Slice会直接分配Slice的三大金刚,长度容量可指定,默认为0;通过new得到的Slice不会分配Slice的三大金刚,只是给你个地址,这个地址指向三大金刚的位置,也就是指针,不过这个时候三大金刚也是未初始化的。未初始化,就不能直接操作、赋值之类的(new得到的变量可通过append进行添加值,然后分配三大金刚)那数组是什么Sl原创 2021-06-02 14:36:59 · 179 阅读 · 1 评论 -
计算机里的字符串与GO语言中的字符串
引入OK,计算机中使用0和1存储所有数据,对于数字,容易理解,通过二进制可以表示和存储。那么字符串呢?首先的解决方法是,定义一个字符集,比如OK我是夏洛,分别对六个字符进行对应编码。所以最初的ASCII字符集出现了,不过由于较早,所以很多字符没收入,比如中文,经过一系列增加修订,一直有很多字符集出现。最终Unicode出现,制霸统一,实现跨语言,跨平台的文本转换和处理。如何划分好了,编码解决了,如何读取?一长串内容该怎么划分?首先的解决办法是,每一个字符都使用固定长度进行编码,可行,也就是原创 2021-06-02 14:26:20 · 122 阅读 · 0 评论 -
Golang深入学习之GC回收机制
0、各个版本机制相关概念垃圾回收内存管理自动释放三色标记法STW(stop the world)GO v1.3及之前GC - 标记清除法STW:强制暂停当前程序的所有逻辑业务。标记清除(mark and sweep):执行STW,遍历对所有的可达对象做上标记,(可达对象:通过该程序创建、调用和依赖的对象,不包括依赖该程序中对象的对象),剩余不可达的对象(即未标记的对象)清除。缺点:会使用STW,让程序暂停,性能低,程序卡顿;标记需要扫描整个heap,复杂度高;会产生heap碎片,随原创 2021-04-30 20:20:33 · 193 阅读 · 0 评论 -
Golang深入学习之GPM模型
引言一些相关知识进程占用内存:虚拟内存4GB(32bit OS)线程占用内存:大约4MB演进过程并发执行各种线程,切换线程会造成较大的性能损耗,多线程的同步竞争(锁、竞争资源冲突等)问题,最后还有上面说到的占用内存较大。系统分为内核空间和用户空间,可以通过这个思想,将线程分割开来作为一个个协程co-routine,内核空间存放内核线程,用户空间存放切割后的协程,中间通过协程调度器来维持工作。所以说,M:N的调度工作就交给了协程调度器,线程层面(即内核空间)语言控制不了,所以说语言间的区别原创 2021-04-29 20:40:45 · 623 阅读 · 0 评论