Go语言中文网 为您找到相关结果 551

3行写爬虫 - 使用 Goribot 快速构建 Golang 爬虫

[zhshch2002/goribot: [Crawler/Scraper for Golang]Make a Golang spider in 3 lines](https://github.com/zhshch2002/goribot)是我的一个业余项目,目的是能尽可能简洁的使用Golang开发爬虫应用。 **注意:这个项目正处于beta版本,不建议直接使用在重要项目上。Goribot的功能都经过测试,如果有问题欢迎来提issues。** # 安装 ```shell go get -u github.com/zhshch2002/goribot ``` # 访问网络 不需要冗长的初始化和配置过程,使用`goribot`的基本功能只需要三步。 ```Go package main impo...阅读全文

博文 2019-10-13 18:00:37 zhshch

为什么程序员都不喜欢使用switch,而是大量的 if……else if ?

请用5秒钟的时间查看下面的代码是否存在bug。 OK,熟练的程序猿应该已经发现Bug所在了,在第8行和第10行下面我没有添加关键字break; 这就导致这段代码的行为逻辑与我的设计初衷不符了。缺点一. 语法正确,逻辑错误这就是第一个理由为什么程序猿很少使用switch来做条件判断,对于新手来说忘记写break实在是再普通不过了,就算是老猿忘记写也是时有发生的事情,而这个语法错误在诸多的语法检查器上没有办法检查出来的,因为从语法角度来说是正确的!可是代码的处理逻辑却是错误的!用if来重写这段代码的话,就不会发生这种错误。 上面的代码为了保证正确我添加了else做一个逻辑上的保证,其实如果不写else,这段代码也不会发生逻辑错误,而且一旦我忘记写花括号的时候,语法编译器是会提示我添加的,甚至可以...阅读全文

博文 2019-10-27 00:02:49 aside section._1OhGeD

什么是EOS智能合约

虽然智能合约(Smart Contract)这个词现在已经很流行了,但如果你问我到底什么是智能合约?我还真不能马上给出准确的答案,为此,我查看了 wikipedia 上关于 Smart Contract 的词条 (http://t.cn/RVQQ1Ja):Asmart contractis a computer protocol intended to digitallyfacilitate, verify, or enforce the negotiation or performance of a contract. Smart contracts allow the performance of credible transactionswithout third parties. T...阅读全文

博文 2018-11-15 01:34:41 以太中文网

Go 内存管理 -- 内存分配 一

前言 go作为一个比较新晚(新)的语言,自然借鉴前辈们的优点,比如说语言本身负责内存管理、对协程和高并发的高优支持、简单高效的语法等。本篇及后续的几篇要讲的就是还没提到的比较复杂的内存管理。 学习内存管理(分配&回收)前,如果有JVM的内存管理的基础,会变得非常简单,如果是第一次接触内存管理,在看完Go的内存管理后可以去看看JVM的,对比着学习比较容易理解。 go的内存管理思路是基于google 的tcmalloc(thread-caching-malloc)实现的,常见的内存分配器还有ptmalloc、jemalloc,但是tcmalloc的性能更高,尤其是高并发场景下。 关于tcmalloc tcmalloc的分配的内存主要来源于:全局缓存堆、进程私有缓存,小容量的内存申请使用私有缓存,...阅读全文

博文 2019-07-15 22:32:42 邹志全

02.1跟雨痕看go源码-内存分配(分配&回收)

内存分配和垃圾回收有关,这里我们可以先看一下内存分配。 垃圾回收比较复杂,后面讲。 一开始雨痕大大说了几个基本策略: 每次从操作系统申请一大块内存(比如1MB),以减少系统调用。 将申请到的大块内存按预定大小预先切分成小块,构成链表。 为对象分配内存时,只需从大小合适的链表中提取一个小块即可。 回收对象内存时,将该小块内存重新归还到原链表,以便复用。 如果闲置内存过多,则尝试归还部分内存给操作系统,降低内存开销。 里面提到了两个概念 span: 就是1提到的大块内存被切成小块的链表。 object: 就是上面说的小块。 这里span虽然是按照小块的规格进行了分级,但实际上采取了比较灵活的策略,可能会在必要条件下把较大规格span的链表的一部分借给较小规格的span,实际合并时也会尝试合并相邻...阅读全文

博文 2016-09-12 13:00:01 bairongdong1

hdu 5193 Go to movies Ⅱ 块状链表 + 树状数组

数组的定位o(1),插入o(n). 链表的定位o(n),插入o(1). 所以把二者结合,是复杂度均摊为 sqrt(n) 设每块的大小为S,那么删除或者添加元素时,维护逆序对数的复杂度是O(S+\frac{P}{S}* \log n)o(S+(p/s)*logn),S是块内直接暴力更新逆序对的代价,(n/s)∗logn在前面块找比它大和在后面块中找比它小的代价,P表示当前元素的个数。为了使这两部分复杂度尽量均摊让S=\frac{P}{S}* \log nS=(p/s)*logn,S取sqrt(p*logn)。直接通过分块暴力添加和删除时,块的大小会退化,。。。。。(注:原官方题解说重构,不太清楚怎么叫重构。这里为了防止退化,在每个块元素过多时采取分裂操作)。因此整个问题的复杂度为O(m\sqr...阅读全文

博文 2016-07-07 16:00:05 Techmonster

重温一遍数据结构之线性表(golang版)

目的 因为最近工作中碰到了一些关于数据结构的问题,发现有些生疏了,所以想重新自己再理一遍,就当是给自己的记录,之所以用golang主要也是因为对goalng比较感兴趣,写起来也比较顺手。本意也不是想分享关于什么是数据结构,因为这种概念性的东西没有什么太大意义,其实最重要的是让自己能看懂自己写了些什么,但是代码中写了非常详细的注释,所以基本都是以代码为主 线性表之顺序存储结构 以下代码是线性表中的顺序存储结构,基本略去了些容错的考虑,还是以实现功能为主 package main //线性表中的顺序存储结构 import ( "fmt" ) // 线性表中存储的数据类型 type Elem int type SqList struct { //最大长度 maxsize int // 当前长度 l...阅读全文

博文 2017-11-19 15:05:03 woshicixide

相比if语句,switch语句的优缺点

缺点一. 语法正确,逻辑错误 这就是第一个理由为什么程序猿很少使用switch来做条件判断,对于新手来说忘记写break实在是再普通不过了,就算是老猿忘记写也是时有发生的事情,而这个语法错误在诸多的语法检查器上没有办法检查出来的,因为从语法角度来说是正确的!可是代码的处理逻辑却是错误的!用if来重写这段代码的话,就不会发生这种错误。 错误示例: $(function () { let a = 1; switch (a) { case 0:alert(0); case 1:alert(1); default:alert(2); } }); 这样就会导致语句不会中断,弹出1后再弹出2。 缺点二 .死板的语法 Switch尽管对于break很宽容,但是对判断条件很严苛,case后面只能跟常量,如果...阅读全文

博文 2020-01-07 12:32:41 MC桥默

Golang Web开发时前端出现谜之空白换行的坑

在使用Golang做Web开发时,有时候渲染出来的模板在前台显示时会出现一些奇怪的空白换行,具体特征就是查看css样式表并没有相关定义的空白部分。 分析: 查看出现问题页面的网页源代码,复制空白换行部分转码为Unicode编码,发现其中包含了\u2028这样的字符【图一】。 【图一】 另外,直接在浏览器检查里边的html选择Edit as html,也可发现在空白处存在小红点,鼠标移上会直接显示该字符是\u2028【图二】。查阅资料发现,这样的换行符在JavaScript中并不支持。 【图二】 解决方法: 在网页检查可以发现,直接删除这些小红点便可解决问题。网上有直接前端处理的方式,即搜索页面中的\u2028并将其替换为\\u2028即可,当然也可以在后台使用Golang进行处理,即在输出h...阅读全文

博文 2016-08-11 12:00:00 yate1996

Go 中 List 的实现方式

为了快速回顾Go基本的语法知识,打算用Go中的基本语法以及特性来实现一些常见的数据结构和排序算法,通过分析如何实现一些基本的数据结构,可以很快学习Go的语法特性。记忆更加深刻,掌握更加迅速。这是我认为学习一门新语言入门最好的方式。这也是方便自己以后需要用Go来写东西的一种前期准备,到时候就不用去翻一些教程了。系列博文的第一篇就从如何实现List开始。需求大家都知道基本链表得有以下特性:链表的初始化、链表的长度、节点的插入、删除、查找等一些常见的基本操作,最后写好之后,需要测试。关于测试,我之前写过Go的系列笔记中有叙述,不再重复。实现初始化有语言基础的人都知道,链表是由节点连接而成,这其中在定义一个List数据结构之外,还需要定义一个Node类型的数据结构。先说Node类型的数据结构,首先L...阅读全文

博文 2017-09-27 03:29:16 allenwu.itscoder.com

二叉搜索树实现 in Go语言

用Go实现了下二叉搜索树,还是花了不少时间,在实现中使用的是单向链表,这才算是体会到了双向链表在实现中的优势 package datastructure import ( "container/list" "fmt" ) type BSTree struct { root *Node } type Node struct { left *Node right *Node value int } // NewBSTree 创建树 func NewBSTree() *BSTree { return &BSTree{} } func (t *BSTree) Insert(value int) { var parent *Node z := &Node{value: value} x := t.ro...阅读全文

博文 2016-04-19 10:00:05 u013564276

golang defer实现原理

defer是golang提供的关键字,在函数或者方法执行完成,返回之前调用。每次defer都会将defer函数压入栈中,调用函数或者方法结束时,从栈中取出执行,所以多个defer的执行顺序是先入后出。 for i := 0; i <= 3; i++ { defer fmt.Print(i) } //输出结果时 3,2,1,0 defer的触发时机 官网说的很清楚:A "defer" statement invokes a function whose execution is deferred to the moment the surrounding function returns, either because the surrounding function executed a r...阅读全文

博文 2019-10-08 16:32:50 bunnyhuangw

Go数据结构之栈

一、什么是栈 这是杭州地铁1号线线路图。大卫哥考考大家,地铁列车如何调头? 我也不卖关子了,列车通常是用“人字轨道”来变换车道。 列车先从A轨道开进“人字轨道”里,再从B轨道开出。从A轨道开进去的时候1号车厢是车头,从B开出来的时候4号车厢就变成车头了。所以大家看到地铁前后各一个车头。“人字轨道”有个特点:先进后出,英文简写就是FILO,含义自己体会。计算机专家把“人字轨道”抽象出来,提出了一个叫“栈”的概念。 栈和“人字轨道”的特点是一样的FIFO,只不过把车厢换成了数据。接下来,看大卫哥把栈扒的底裤不剩。 二、栈的结构 大卫哥把栈拆分成容器和链表两块,容器用结构体实现,链表用单链表,当然大家也可以用其他链表结构,甚至数组来实现。 三、接口说明及实现 1、Init 初始化栈,其实就是初始化...阅读全文

博文 2017-11-16 03:05:04 懒人记

Go内存分配那些事,就这么简单!

文链接:mp.weixin.qq.com/s/3gGbJaeuv… 新老朋友好久不见,我是大彬,这篇文章准备了很久,不是在拖延,而是中间做了一些其他事情,耽搁了一些。 这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。 从非常宏观的角度看,Go的内存管理就是下图这个样子,我们今天主要关注其中标红的部分。 友情提醒: 文章有点长,建议先收藏,后阅读,绝对是学习内存管理的好资料。 本文基于go1.11.2,不同版本Go的内存管理可能存在差别,比如1.9与1.11的mheap定义就是差别比较大的,后续看源码的时候,请注意你的go版本,但无论你用哪个go版本,这都是一个优秀的资料,因为内存管理的思想和框架始终未变。 Go这门语言抛弃了C/C++中的开发者管理内存...阅读全文

博文 2019-07-07 15:34:27 我是大彬

【go密码学】-Hash

Hash(散列函数) 简单说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。一个优秀的Hash算法,将能实现: 正向快速:给定明文,快速计算出hash值。 逆向困难:给定hash值,很难逆推出明文。 输入敏感:原始输入信息修改一点消息,产生的hash值看起来应该都有很大不同。 冲突避免:很难找到2段不同的明文,使他们的hash值相同。 典型的Hash算法 //将任何长度的字符串,通过运算,散列成0-15整数 func HashCode(key string) int { var index int = 0 index = int(key[0]) for k := 0; k < len(key); k++ { //1103515245是个好数字,使通过hashCode散列出的0-1...阅读全文

博文 2018-10-11 15:35:10 jincheng828

深入理解Go-runtime.SetFinalizer原理剖析

finalizer是与对象关联的一个函数,通过runtime.SetFinalizer 来设置,它在对象被GC的时候,这个finalizer会被调用,以完成对象生命中最后一程。由于finalizer的存在,导致了对象在三色标记中,不可能被标为白色对象,也就是垃圾,所以,这个对象的生命也会得以延续一个GC周期。正如defer一样,我们也可以通过 Finalizer 完成一些类似于资源释放的操作 1. 结构概览 1.1. heap type mspan struct { // 当前span上所有对象的special串成链表 // special中有个offset,就是数据对象在span上的offset,通过offset,将数据对象和special关联起来 specials *special //...阅读全文

博文 2019-09-08 12:02:39 tyloafer

个人算法练习库-go语言版--1

package main import ( "fmt" "util/stack" ) type tree struct { data int l *tree r *tree } type list struct { data int next *list } //阶乘 func fact(n uint32) uint32 { if n == 0 { return 1 } return n * fact(n-1) } //二分查找 func BSearch(a []int, element, low, height int) int { if low > height { return -1 } mid := (low + height) / 2 if a[mid] == element { ...阅读全文

博文 2016-02-19 19:00:03 wslzwps00321

golang 数据结构 栈的pop与push

数据实现类似C语言的实现方式。我这里使用两种方式实现 栈的 pop 和 push。 第一种使用 struct 实现 type Node struct { value interface{} previous *Node // 前一个节点 Next *Node // 下一个节点 } func (sel *Node) Value() interface{} { return sel.value } func newNode(val interface{}) *Node { return &Node{value: val} } type Stack struct { sync.RWMutex head *Node rear *Node length int32 } func NewPool() *...阅读全文

博文 2019-06-12 11:32:40 VIL凌霄

Go自动填写古诗词

“白日依山尽,___”。下句自然填黄河入海流,那么“日月忽其不淹兮,___,___,恐美人之迟暮”,中间两句怎么填呢? 最近工作中有个需求,就是1500道语文诗词填空题没有答案,现在需要给这些题目大爷们匹配它们对应的答案,好在题目信息都很完整,指出了诗词出处、作者信息。自然想到到网上爬取对应文章信息然后字符串匹配答案。目前做完,效果还可以,基本上所有题目的答案都有了,现把操作流程记录下,做个总结。 1. 文章信息获取 网上找了很久,目前发现百度汉语对古诗词收录的比较好,格式也比较规范,整个爬取过程还是比较简单,浏览器分析网站,找到它们的搜索接口:http://hanyu.baidu.com/hanyu/ajax/sugs只需要传一个参数:mainkey,是一个urlencode格式的字符串。...阅读全文

博文 2018-03-09 10:48:55 掘金

golang笔记之方法(二)基于指针对象的方法

当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要更新一个变量,或者函数的其中一个参数实在太大我们希望能够避免进行这种默认的拷贝,这种情况下我们就需要用到指针了。对应到我们这里用来更新接收器的对象的方法,当这个接受者变量本身比较大时,我们就可以用其指针而不是对象来声明方法。 如下: func (p *Point) ScaleBy(factor float64) { p.X *= factor p.Y *= factor } 总结为两点 不管你的method的receiver是指针类型还是非指针类型,都是可以通过指针/非指针类型进行调用的,编译器会帮你做类型转换。 在声明一个method的receiver该是指针还是非指针类型时,你需要考虑两方面的因素,第一方面是这个对象本身是不是...阅读全文

博文 2019-05-06 15:35:27 月下独酌100

golang 和 C 的基本数值类型对照表

golang 和 C 的基本数值类型转换对照表如下: C语言类型 CGO类型 Go语言类型 char C.char byte singed char C.schar int8 unsigned char C.uchar uint8 short C.short int16 unsigned short C.ushort uint16 int C.int int32 unsigned int C.uint uint32 long C.long int32 unsigned long C.ulong uint32 long long int C.longlong int64 unsigned long long int C.ulonglong uint64 float C.float float3...阅读全文

博文 2019-07-21 02:32:37 shooter

图解 TCMalloc

-- 前言 -- TCMalloc ( http://link.zhihu.com/?target=http%3A//goog-perftools.sourceforge.net/doc/tcmalloc.html ) 是 Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征:对抗内存碎片、在多核处理器能够 scale。据称,它的内存分配速度是 glibc2.3 中实现的 malloc的数倍。 之所以学习 TCMalloc,是因为在学习 Golang 内存管理的时候,发现 Golang 竟然就用了鼎鼎大名的 TCMalloc,而在此之前虽然也对内存管理有过一些浅薄的了解,但一直没有机会深入。因此借此机会...阅读全文

博文 2017-09-14 06:08:50 hellocode

大数据开发学习之Hive的静态分区与动态分区

分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描其他不关心的分区,快速定位,提高查询效率。分动态和静态分区两种:1. 静态分区:若分区的值是确定的,那么称为静态分区。新增分区或者是加载分区数据时,已经指定分区名。create table if not exists day_part1( uid int, uname string ) partitioned by(year int,month int) row format delimited fields terminated by '\t'; ##加载数据指定分区 load data local inpath '/root/Desktop/...阅读全文

博文 2018-07-20 14:16:38 lnh2017

Go 语言之常量

发自自己的公众号(灰子学技术)原文链接:https://mp.weixin.qq.com/s/2QDEwy7Udnzi5rpVmnCFxQ一、Go语言中const常量Go语言的常量关键字是const,用于存储不会改变的数值,定义的格式为:const valueName type = value或者const valueName = value const a = "abc" const b string = "Hello" Go里面常量,具有常量的基本特质,不能修改。原因是:常量的数值在编译阶段就已经确定了,运行时不能够修改。例子如下:​​​​​​​package main import ( "fmt") func main() { const a = "abc" const b strin...阅读全文

博文 2019-09-04 09:19:29 ZhDavis

用Golang写一个搜索引擎(0x03)--- 跳跃表,哈希表

前面已经说了倒排索引的基本原理了,原理非常简单,也很好理解,关键是如何设计第二个倒排表,倒排表的第二列也很好设计,第一列就是关键了,为了满足快速查找的性能,设计第一列的结构,我们需要满足以下两个条件。 查找非常快,能在极短的时间内找到我们需要的关键词所在的位置。 添加关键词也需要比较快,能保证输入文档的时候尽可能的快。 除了上面两个条件以外,还有一些加分项: 如果能尽可能少的使用内存,那肯定是好的 如果能顺序的遍历整个列,也肯定比较好 为了满足能查找,能添加,我们首先想到的是顺序表,也就是链表了,链表的话,添加不成问题,关键是查找的复杂度是O(n),这还能忍?所以链表第一个不考虑了。不过有一个链表的变种,我们是可以考虑一下,那就是跳跃表。 跳跃表(SkipList) 什么是跳跃表呢?跳跃表也...阅读全文

博文 2016-07-27 10:53:16 吴yh坚

Go Select的实现

select语法总结 select对应的每个case如果有已经准备好的case 则进行chan读写操作;若没有则执行defualt语句;若都没有则阻塞当前goroutine,直到某个chan准备好可读或可写,完成对应的case后退出。 Select的内存布局了解chanel的实现后对select的语法有个疑问,select如何实现多路复用的,为什么没有在第一个channel操作时阻塞 从而导致后面的case都执行不了。为了解决疑问,对应代码看一下汇编调用了哪些runtime层的函数,发现select语法块被编译器翻译成了以下过程。 创建select–>注册case–>执行select–>释放select 12345select { case c1 <-1: // non-blocking c...阅读全文

博文 2017-12-26 03:25:43 nino's blog

Go实现双向链表

本文介绍什么是链表,常见的链表有哪些,然后介绍链表这种数据结构会在哪些地方可以用到,以及 Redis 队列是底层的实现,通过一个小实例来演示 Redis 队列有哪些功能,最后通过 Go 实现一个双向链表。 目录 1、链表 1.1 说明 1.2 单向链表 1.3 循环链表 1.4 双向链表 2、redis队列 2.1 说明 2.2 应用场景 2.3 演示 3、Go双向链表 3.1 说明 3.2 实现 4、总结 5、参考文献 1、链表 1.1 说明 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多...阅读全文

博文 2019-09-20 11:04:52 link1st

当你说智能合约,你说的到底是什么(EOS篇)

虽然智能合约(Smart Contract)这个词现在已经很流行了,但如果你问我到底什么是智能合约?我还真不能马上给出准确的答案,为此,我查看了 wikipedia 上关于 Smart Contract 的词条: A smart contract is a computer protocol intended to digitally facilitate, verify, or enforce the negotiation or performance of a contract. Smart contracts allow the performance of credible transactions without third parties. These transactions...阅读全文

博文 2018-08-12 10:35:02 冯雅杰

深入理解 Go defer

在上一章节 《深入理解 Go panic and recover》 中,我们发现了 defer 与其关联性极大,还是觉得非常有必要深入一下。希望通过本章节大家可以对 defer 关键字有一个深刻的理解,那么我们开始吧。你先等等,请排好队,我们这儿采取后进先出 LIFO 的出站方式... 原文地址:深入理解 Go defer 特性 我们简单的过一下 defer 关键字的基础使用,让大家先有一个基础的认知 一、延迟调用 func main() { defer log.Println("EDDYCJY.") log.Println("end.") } 输出结果: $ go run main.go 2019/05/19 21:15:02 end. 2019/05/19 21:15:02 EDDYCJ...阅读全文

博文 2019-05-27 21:34:37 煎鱼

Go语言内存分配器-MSpan

Go语言内存分配器-MSpan 11 October 2013 skoo 阅读 713 次 0 人喜欢 0 条评论 收藏 MSpan和FixAlloc一样,都是内存分配器的基础工具组件,但和FixAlloc没太大的交集,各自发挥功效而已。span(MSpan简称span)是用来管理一组组page对象,先解释一下page,page就是一个4k大小的内存块而已。span就是将这一个个连续的page给管理起来,注意是连续的page,不是东一个西一个的乱摆设的page。为了直观形象的感受一下span,还是得画个图吧,图形是最好的交流语言。 MSpan结构定义在malloc.h头文件中,代码如下: struct MSpan { MSpan *next; // in a span linked list...阅读全文

博文 2016-04-11 16:00:01 caoshulin1989

图解Go语言内存分配

Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。 Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc算法,全称Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。 基础概念 Go在程序启动的时候,会先向操作系统申请一块内存(注意这时还只是一段虚拟的地址空间,并不会真正地分配内存),切成小...阅读全文

博文 2019-06-04 23:32:39 Stefno

图解Go语言内存分配

目录 基础概念 内存管理单元 内存管理组件 mcache mcentral mheap 内存分配流程 总结 参考资料 Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。 Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc算法,全称Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。 基础概...阅读全文

博文 2019-05-22 15:26:26 qcrao-2018

Go数据结构之集合

一、什么是集合 集合就是不同对象的无序聚集。那么链表和集合有什么关系呢?我们来变个魔术。如下图是各种颜色组成的链表:下面我们一步步把链表变成集合。第一步砍去链接第二步去掉重复第三步放到一个框里摇一摇就成集合了 可以看出集合有这些特点: 无序:链表去掉链接,就是去掉元素间有序状态。 不重复:去掉重复的玫红色。 虽然说集合是一种数学概念,但在实际生活中无处不透露着集合。比如一个班级的学生是一个集合。班级里的男生又是一个集合。 二、集合的结构大卫哥这里为了简化概念的描述,继续用单链表来表示集合,但是在对集合做计算的时候单链表并不合适,数据量大的时候它的弊端就会显现,在讲到后面的数据结构和算法的时候,我们再回头来完善前面讲的数据接口的实现。 三、接口说明及实现 2、Init初始化集合,本质是初始化链...阅读全文

博文 2017-12-09 02:04:40 懒人记

Go Redigo 源码分析(二) 连接池

Redigo 连接池的使用 大家都知道go语言中的goroutine虽然消耗资源很小,并且是一个用户线程。但是goroutine也不是无限开的,所以我们会有很多关于协程池的库,当然啊我们自己也可以完成一些简单的携程池。redis也是相同的,redis的链接也是不推荐无限制的打开,否则会造成redis负荷加重。先看一下Redigo 中的连接池的使用 package main import ( "fmt" "github.com/panlei/redigo/redis" "time" ) func main() { pool := &redis.Pool{ MaxIdle: 4, MaxActive: 4, Dial: func() (redis.Conn, error) { rc, err :...阅读全文

博文 2019-05-27 22:34:44 大二小的宝

你还在一昧的使用if-else吗?

请用5秒钟的时间查看下面的代码是否存在bug。 OK,熟练的程序猿应该已经发现Bug所在了,在第8行和第10行下面我没有添加关键字break; 这就导致这段代码的行为逻辑与我的设计初衷不符了。缺点一. 语法正确,逻辑错误这就是第一个理由为什么程序猿很少使用switch来做条件判断,对于新手来说忘记写break实在是再普通不过了,就算是老猿忘记写也是时有发生的事情,而这个语法错误在诸多的语法检查器上没有办法检查出来的,因为从语法角度来说是正确的!可是代码的处理逻辑却是错误的!用if来重写这段代码的话,就不会发生这种错误。 上面的代码为了保证正确我添加了else做一个逻辑上的保证,其实如果不写else,这段代码也不会发生逻辑错误,而且一旦我忘记写花括号的时候,语法编译器是会提示我添加的,甚至可以...阅读全文

【随笔】异步编程浅析

运营研发团队程序媛 张晶晶 背景 1.最近研究redis关于主从复制的功能实现,发现客户端实时响应slaveof的命令后,把主从复制添加到epoll的时间事件中再进行操作。因此有疑问,redis是如何进行文件和时间事件的调度 2.go的一大特点就是从语言方面支持协程,提供系统的并发性,那么go语言中是否还需要epoll这种事件驱动模型 基于以上两个疑问,我进行了事件驱动模型的研究和分析 分析 先明确一点:事件驱动模型的本质是单线程的,因为想要同时处理多个请求,我们需要换成事件模型的方式重构代码 1.最简单的模型是单线程 bind() listen() while(1) { accept() //接收新连接 handle() //处理消息 } 当多个客户端请求时只能一个个处理,只要等到当前连接...阅读全文

博文 2018-10-24 17:34:44 PHP7和Redis4研究

Golang 数据结构:链表

Golang 中链表的实现及常用操作,数据结构系列原文:flaviocopes.com,翻译已获作者授权。 前言链表的结构类似于数组,但插入元素的代价比数组小得多,因为在数组中插入元素,需要把插入位置后边所有的元素后移一个位置,删除元素则要全部前移。 数组将元素顺序存储在内存单元中(静态分配内存),而链表是通过元素中的指针,将元素存储在零散的内存中(动态分配内存) 链表相比数组有个明显的缺点:查找元素时不知道元素在链表中的地址,需要从第一个元素开始遍历整条链表来寻找。 链表结构基本操作:12345678Append(t) // 将元素 t 追加到链表尾部Insert(i, t) // 在位置 i 处插入元素 tRemoveAt(i) // 移除位置 i 的元素IndexOf(t) // 返回...阅读全文

博文 2018-03-15 10:58:54 wuYinBlog

为什么你们不喜欢使用switch,而是大量的 if...else if?

作者:熊爸爸的科技工坊请用5秒钟的时间查看下面的代码是否存在bug。 OK,熟练的程序猿应该已经发现Bug所在了,在第8行和第10行下面我没有添加关键字break; 这就导致这段代码的行为逻辑与我的设计初衷不符了。缺点一. 语法正确,逻辑错误这就是第一个理由为什么程序猿很少使用switch来做条件判断,对于新手来说忘记写break实在是再普通不过了,就算是老猿忘记写也是时有发生的事情,而这个语法错误在诸多的语法检查器上没有办法检查出来的,因为从语法角度来说是正确的!可是代码的处理逻辑却是错误的!用if来重写这段代码的话,就不会发生这种错误。 上面的代码为了保证正确我添加了else做一个逻辑上的保证,其实如果不写else,这段代码也不会发生逻辑错误,而且一旦我忘记写花括号的时候,语法编译器是会...阅读全文

博文 2019-10-12 23:32:54 aside section ._1OhGeD

Floyd's Tortoise and Hare & 环检测算法

算法推导 image 当hare的移动速度是tortoise的 2 倍, 设起始点到环的入口的距离是T,环的长度是C, 当tortoise第一次走到环的入口entry point时,我们假设这是tortoise与hare之间的在环上的距离是r, 从start point开始出发到tortoise第一次走到环的入口时,hare移动的距离是 T + r + k*C,k >= 0, 又因为,hare移动的速度是tortoise的两倍,且这时tortoise移动的距离是T,所以hare移动的距离是 2T。 得到等式 A T + r + k*C = 2T,k >= 0 简化得到等式 B r + k*C = T,k >= 0 [图片上传失败...(image-1940ba-1559799507418)]...阅读全文

博文 2019-06-06 14:32:42 polar9527

leetcode 141 判断链表中是否有环

题目描述 给定一个链表,判断链表中是否有环。进阶: 你能否不使用额外空间解决此题? 解题思路 无环链表,最后一个节点为nil,有环链表可以无限循环next下去 不用额外空间:快慢节点,慢节点一次走一步,快节点一次走两步,当进入环中,每次循环,快节点会离慢节点近一步,快节点最终会追上慢节点 用额外空间: 用map存走过的节点,第一个走过的节点就是环的入口 代码实现 // ListNode Definition for singly-linked list. type ListNode struct { Val int Next *ListNode } func hasCycle(head *ListNode) bool { if head != nil { slow := head fast ...阅读全文

博文 2018-10-26 19:34:38 tomorrowwu

剖析golang map的实现

[TOC] 本文参考的是golang 1.10源码实现。 golang中map是一个kv对集合。底层使用hash table,用链表来解决冲突,通过编译器配合runtime,所有的map对象都是共用一份代码。 对比其他语言 c++使用红黑树组织,性能稍低但是稳定性很好。使用模版在编译期生成代码,好处是效率高,但是缺点是代码膨胀、编译时间也会变长。 java使用的是hash table+链表/红黑树,当bucket内元素超过某个阈值时,该bucket的链表会转换成红黑树。java为了所有map共用一份代码,规定了只有Object的子类才能使用作为map的key,缺点是基础数据类型必须使用object包装一下才能使用map。 1. 函数选择 hash函数,有加密型和非加密型。加密型的一般用于加密...阅读全文

博文 2018-10-27 18:34:39 123archu

Go 内存管理

内存管理缓存结构Go实现的内存管理采用了tcmalloc这种架构,并配合goroutine和垃圾回收。tcmalloc的基本策略就是将内存分为多个级别。申请对象优先从最小级别的内存管理集合mcache中获取,若mcache无法命中则需要向mcentral申请一批内存块缓存到本地mcache中,若mcentral无空闲的内存块,则向mheap申请来填充mcentral,最后向系统申请。 mcache + mspan最小级别的内存块管理集合mcache由goroutine自己维护,这样从中申请内存不用加锁。它是一个大小为67的数组,不同的index对应不同规格的mspan。newobject的时候通过sizetoclass计算对应的规格,然后在mcache中获取mspan对象。 123type ...阅读全文

博文 2017-12-18 13:34:54 nino's blog

go-内存分配器

整合两个文章,FixAlloc 和 MSpan。 内存模型如下: FixAlloc FixAlloc称不上是核心组件,辅助实现整个内存分配器核心的一个基础工具。引入FixAlloc的目的只是用来分配MCache和MSpan两个特定的对象,所以内存分配器中有spanalloc和cachealloc两个组件。MCache和MSpan两个结构在malloc.h中有定义。 定义在malloc.h文件中的FixAlloc结构如下,比较关键的三个字段是alloc、list和chunk,其他的字段主要都是用来统计一些状态数据的,比如分配了多少内存之类。 struct FixAlloc { uintptr size; void *(*alloc)(uintptr); void (*first)(void *...阅读全文

博文 2016-02-18 22:00:00 lmxmimihuhu

golang 源码学习之GMP (goroutine)

源码 版本 1.14.1 相关目录 runtime/asm_amd64.s runtime/proc.go runtime/runtime2.go 关键概念 G - 我们代码写的go func(){ } M - 内核线程 P - M调度G的上下文, P中存储了很多G,M通过调用P来获取并执行G。为了方便,下文中称它为==局部调度器== schedt - 全局调度器,主要存储了一些空闲的G、M、P G、M、P、schedt之间的关系 graph TB; subgraph schedt A(空闲G集合) B(runable G集合) C(空闲P集合) D(空闲M集合) end graph TB; subgraph M A(running G) end subgraph P B(空闲G集合) C(...阅读全文

博文 2020-05-11 07:32:45 ihornet

内存池原理详解

从一个问题谈起:从内核中的伙伴系统,页高速缓存系统,slab内存管理系统,常规内存高速缓存系统,到用户线性区管理,用户动态内存分配malloc/free,最终因时制宜选择自定义内存区管理策略,到底有哪些驱动力? 接下来我们来梳理一下 1.伙伴系统 伙伴系统是内核为解决外碎化问题引入的内存管理机制。在32位体系结构中,虚拟内存空间的第四个GB用来线性的映射物理内存开始的DMA和低端内存管理区。而内存管理的基本单位是页,一个页的大小为4kB。所谓的外碎化指的是多次申请多个页的内存并释放后,会导致内存中存在不间隔的无法集中利用的页,其基本单位仍然是页,只是没有办法找到连续的可用来分配的多个页框。为了应对这样的事情,伙伴系统应运而生。伙伴系统首先将内存分为11个不同的2指数个大小的内存对象集合,每个...阅读全文

博文 2019-10-19 11:32:45 aside section ._1OhGeD

Golang数据库编程之GORM模型定义与数据库迁移

在开发应用程序时,一般而言,我们是先设计好数据表,再使用开发语言建立对应的数据模型,不过,我们今天要讲的是一个逆向操作的过程,即如何通定义GORM框架的数据模型,然后再通过执行GROM框架编写的应用程序,用定义好数据模型在数据库中创建对应的数据表。 因此需要先讲讲怎么定义GORM的数据模型。 模型定义 一般来说,我们说GROM的模型定义,是指定义代表一个数据表的结构体(struct),然后我们可以使用GROM框架可以将结构体映射为相对应的关系数据库的数据表,或者查询数据表中的数据来填充结构体,如下所示,我们定义了一个名为Post的结构体。 type Post struct { PostId int Uid int Title string Content string Type int Cr...阅读全文

博文 2019-06-03 23:34:19 掘金

循环链表的Go语言实现

一、什么是循环链表 循环链表的节点形成一个圈。把单链表的尾巴指向开头形成单循环链表。把双向链表的尾巴与开头链接起来就形成双向循环链表。使用循环链表可以不断的绕圈寻找所需要的数据,而不需要像单链表那样每次都从开头开始寻找,可以提高查询的效率。 今天大卫哥先实现一个单向循环链表,双向循环链表的实现就交给大家了。 二、单向循环链表的Go实现 1、节点 单向循环链表的节点和单链表的实现是类似的,不过为了区别,我们取了不同名字。 type CNode struct { data Object next *CNode } 2、单向循环链表 单向循环链表车队由5节车厢组成,1号车是车头。为了表示这种关系,大卫哥用下面的结构体来承载。 type CList struct { size uint64 // 车...阅读全文

博文 2017-11-10 04:04:44 懒人记