Golang
文章平均质量分 78
jeremyke07
学习是件无止境的事情
展开
-
Go语言面试题合集(2022)
强三色不变式:不存在黑色对象引用白色对象的情况了, 因为白色会强制变成灰色。当全部三色标记扫描之后,栈上有可能依然存在白色对象被引用的情况,所以要对栈重新进行三色标记扫描, 但这次为了对象不丢失, 要对本次标记扫描启动STW暂停. 直到栈空间的三色标记结束。如果有个goroutine一直占用资源,那么GMP模型会从正常模式转变为饥饿模式(类似于mutex),允许其它goroutine使用work stealing抢占(禁用自旋锁)。原创 2022-11-26 21:04:55 · 2431 阅读 · 6 评论 -
Go语言数据类型-函数
引用类型:slice,map,接口,channel,指针。值类型:数值型系列,字符串,bool,数值,结构体。那么问题来了:函数属于什么类型?先下结论:函数是指针类型。原创 2022-11-26 16:58:55 · 245 阅读 · 0 评论 -
Go语言类库-reflect(反射)
反射是计算机程序在运行时可以访问,检查和修改本身状态或者行为的一种能力,大多数编程语言都支持反射。Go语言中,使用反射可以在程序执行过程中更新变量和检查对象的属性,调用对象的方法。reflect.TypeOf 返回reflect.type接口类型的变量(其实包内部得到的是一个rtype的结构体指针,在返回是转为了type接口变量),通过调用type接口的方法,能获取类型相关的信息;原创 2022-11-25 01:16:18 · 674 阅读 · 0 评论 -
Go语言类库-sync
通道并不是Go支持的唯一的一种并发同步技术。而且对于一些特定的情形,通道并不是最有效和可读性最高的同步技术。本文下面将介绍sync标准库包中提供的各种并发同步技术。相对于通道,这些技术对于某些情形更加适用。sync标准库包提供了一些用于实现并发同步的类型。这些类型适用于各种不同的内存顺序需求。对于这些特定的需求,这些类型使用起来比通道效率更高,代码实现更简洁。原创 2022-11-09 22:10:00 · 941 阅读 · 0 评论 -
Go语言类库-context
context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。是一种并发安全在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等的类型。原创 2022-11-09 15:10:14 · 294 阅读 · 0 评论 -
Go语言类库-errors
题外话:PathError结构体有error字段,说明这个结构体的Err属性是实现了error接口的类型的对象,于是就会有error接口的方法,所有PathError的对象也会有error接口的方法,也就是说PathError实现了error接口。这里New方法实际上是返回的是一个实现了error接口的类型的变量,这里是errorString结构体变量。能知道错误发生了,但是无法看到他内部到底是什么,不知道具体类型是什么。这样做的不好的地方是自定义的错误和使用错误的包之间形成了依赖关系,代码不够优雅。原创 2022-11-06 19:28:16 · 420 阅读 · 0 评论 -
Go语言数据结构-栈
栈是一种先入后出的有序列表。限制了线性表中元素的插入和删除只能在线性表的同一端进行。允许插入和删除的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。原创 2022-10-24 18:46:20 · 592 阅读 · 0 评论 -
Go语言数据结构-队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列本身是有序列表,数组或链表实现,若使用数组的结构来存储队列的数据,则队列数组的声明如上图, 其中 maxSize 是该队列的最大容量。队列增加数据时候 rear增加;队列消费数据时候 front改变。原创 2022-10-25 23:41:08 · 672 阅读 · 0 评论 -
Go语言数据结构-链表
linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。我们常说的链表,结构有单向链表、双向链表和环形链表。原创 2022-10-27 00:29:38 · 636 阅读 · 0 评论 -
Go语言数据结构-二叉树
二叉树是一种数据结构,它是由 n(n≥1) 个有限节点组成一个具有层次关系的集合。根节点:最上面的节点;叶子节点:左右子节点都为nil的节点。每一个子树,左节点比根节点小,右节点比根节点大的二叉树,二叉树的节点无重复值。如果二叉树中除了叶子结点,每个结点的度都为2,则此二叉树称为满二叉树。如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。对于任何一个子树来说,左树高度和右树高度差不超过1。原创 2022-10-27 00:32:44 · 851 阅读 · 0 评论 -
Go语言数据结构-堆
堆是完全二叉树,且根节点比子节点都大的二叉树称为大根堆;反之称为小根堆。堆的英文是heap;heapSize = 节点个数。原创 2022-10-27 19:07:13 · 676 阅读 · 0 评论 -
Go语言数据结构-图
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。线性表和树可以看做特殊的图。线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点(Vertex)线性表可以没有元素,称为空表;树中可以没有节点,称为空树;但是,在图中不允许没有顶点(有穷非空性)线性表中的各元素是线性关系,树中的各元素是层次关系,而图中各顶点的关系是用边来表示(边集可以为空)。原创 2022-10-27 19:12:30 · 792 阅读 · 0 评论 -
defer函数的实践和原理
编译器会把 go 代码中 defer 语句翻译成对 deferproc 函数的调用;deferproc 函数通过 newdefer 函数分配一个 _defer 结构体对象并放入当前 goroutine 的 _defer 链表的表头;在 _defer 结构体对象中保存被延迟执行的函数 fn 的地址以及 fn 所需的参数;返回到调用 deferproc 的函数继续执行后面的代码。func x() {原创 2022-11-04 11:54:02 · 1020 阅读 · 0 评论