go
Briant996
拒绝八股,实践出真知
展开
-
go 简单实现Java线程池阻塞任务
go 写起起来挺爽,在轻量级协程方面,处理起来更灵活,能够快速实现自己想要的多线程任务,下面的任务为了多线程采集服务器端口,并最终阻塞完成可用端口拼接,脚本方面比较简单,这里不给出,完成map转json输出。下面是线程池的整个实现,为了复用线程池,这里定义了一个任务代理函数代理实际执行任务的Handler函数,利用chan来接受任务,和发送任务结果,并使用通用的类型Interface定义参数,这样我们可以完成很多自定义的任务输入和输出,函数的定义如下://handler 为函数, jobs为定义的原创 2020-11-12 19:32:45 · 289 阅读 · 0 评论 -
go并发模型
go的线程模型KSE:内核调度实体M:内核线程(machine)M通过go运行时系统进行初始化,并与P建立预联系,M可以理解为虚拟内核线程,与KSE一一对应。P:上下文环境,可运行的G队列P:M通过不断与P建立联系,来调用G,代表并发运行G的规模,P具有如下状态(1)Prunning:正在与M关联(2)Psyscall:运行的G正在进行系统调用(3)Pgcstop:停止状态(4)pdead:死亡P中除了包括可运行G队列外,还包括自由G列表,用来包括已完成的G,来提高G ...原创 2020-07-13 19:32:53 · 469 阅读 · 1 评论 -
go简单实现hashmap
hashcode中为什么要乘以3131为质数,方便扩散hash值,并且使hash值唯一 31*i=i<<5-1 方便计算,现在很多虚拟机里面都有做相关优化,使用31的原因可能是为了更好的分配hash地址,并且31只占用5bits!计算效率较高模运算求数组下标值对于现代的处理器来说,除法和求余数(模运算)是最慢的动作。这里还有改进的空间,参考Java的hashmapa % n == (n-1) & a,当n是2的指数时,等式成立。可以采用&运算来代替扩容下面原创 2020-07-13 14:15:30 · 652 阅读 · 0 评论 -
go语言入门(一)
go语言值传递和指针传递不同与java,go中引入了指针,在java中通过对象的引用(对象的堆内存中第一个内存的别名)来使用,复制和函数传参都是值传递,而go对象创建采用的struct来创传递可以使用T(值传递)或者*T(指针传递)传递。使用T传递参数或者赋值时,不可以理解成深拷贝,只是值类型或者指针类型的复制,例如slice、map的赋值等也是值传递slice、map以及chanel这三种类型都是指向指针类型(*T),指向一个底层的数据结构,传递时时传递指针指向的内存值。 值传递修改不会影响,而原创 2020-07-11 11:27:08 · 471 阅读 · 0 评论