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

个人算法练习库-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

图解 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

没想到总结也挺费时间的

这个防盗链真是烦,图片要自己一个一个上传。 时间没把握好,睡得多了点,玩的多了点,明天两篇阅读。 四月份的计划:计划尽量固定时间段 1.上午三番茄,中午13:00睡一会,下午四个番茄【主java,基础知识;副golang的区块链】 2.背单词都在傍晚,和15分钟的听力,一篇阅读连在一起 3.半小时阅读 4.晚上,听力精听课 额外:要多翻看单词本,可以看看笔记,整理下逻辑结构,补充相应的复习视频 多出来的边角时间,可以刷b站,看视频。 要知道人家有的自学的,一天学10小时,光是时间,一天就顶我好几天,以后,学习量是会慢慢增加的...阅读全文

博文 2020-03-31 23:32:46 div密码错误div

幸运岛链Lucky Island Chain(LKC):成熟的技术架构保证公链的稳定运行

幸运岛链Lucky Island Chain(LKC)致力于赋能商业经济,基于区块链技术,研发成熟且先进的技术架构,真正把区块链实用到商业经济,打造安全、可靠、操作性高的公链系统,以数字资产为纽带,为所罗门群岛打造全新可持续发展的经济模型,落地数字资产的商业应用,促进所罗门群岛商业经济快速可持续发展。因此底层基础设施需要具有很强的性能以及可拓展性,幸运岛链的生态架构需要满足模块化的设计理念,强调框架的可拓展性、可交互性、安全性、隐私性。因此幸运岛链的生态架构中也包含了基础层、区块链层、业务层以及应用层。基础层:包括分布式计算、分布式数据库、分布式存储和分布式网络。其中,数据库和分布式存储可以进行插拔,方便进行替换,为第三方提供了更多的选择和广泛的业务支撑能力。 区块链层:包括双通证结构、共识...阅读全文

博文 2019-10-31 17:32:58 aside section._1OhGeD

用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 懒人记

【玩转云存储】对象存储OSS使用方法入门

课程介绍 阿里云对象存储OSS,提供海量、安全、低成本、高可靠的云存储服务,提供99.99999999%的数据可靠性。使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本。 本课程主要介绍对象存储OSS的使用方法。 课程目标 • 掌握对象存储OSS的使用技巧 适合人群 • 云计算开发者 课时列表 • 课时1:对象存储OSS基本概念讲解 • 课时2:对象存储OSS静态网站托管功能 • 课时3:对象存储OSS跨域(CORS)管理功能 • 课时4:对象存储OSS权限控制功能 • 课时5:对象存储OSS日志统计功能 • 课时6:对象存储OSS文件(Obj...阅读全文

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 大二小的宝

【随笔】异步编程浅析

运营研发团队程序媛 张晶晶 背景 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

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

循环链表的Go语言实现

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

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

深度解密Go语言之map

这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。我要说明的是,这里对 map 的基本用法涉及比较少,我相信可以通过阅读其他入门书籍了解。本文的内容比较深入,但是由于我画了各种图,我相信很容易看懂。放上本文的内容提纲:什么是 map维基百科里这样定义 map:In computer science, an associative array, map, symbol table, or dictionary is an abstract data type composed of a collection of (key, value) pairs, such that each possible ke...阅读全文

博文 2019-05-22 10:10:39 码农桃花源

go 链表

package main import ( "fmt" "log" ) // Item 可以理解为范性,也就是任意的数据类型 type Item interface { } // 一个节点,除了自身的数据之外,还必须指向下一个节点,尾部节点指向为nil type LinkNode struct { Payload Item // Payload 为任意数据类型 Next *LinkNode } type LinkNoder interface { // go语言接口,在这个接口里面,我们可以定义一系列的方法。 Add(payload Item) Delete(index int) Item Insert(index int, payload Item) GetLength() int Sea...阅读全文

博文 2019-03-05 23:35:28 295631788

golang链表理解、递归

1、不使用递归 a. 链表间运算(逐位相加) leetcode题目 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807 /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { //副本 node1 := l1 node2 := l2 //初始链表节点,指针才能与nil相比较 headNode := &ListNode{ Val: 0, Next: n...阅读全文

博文 2020-04-06 14:32:41 沧浪水

ARTS第二周打卡(2019.3.25~2019.3.31)

所谓A(Algorithm)R(Review)T(Tips)S(Share): . 每周至少做一个 leetcode 的算法题 . 阅读并点评至少一篇英文技术文章 . 学习至少一个技术技巧 . 分享一篇有观点和思考的技术文章 1 week 2019-03-25~2019.3.31 Algorithm 算法 # [2] 两数相加 # # https://leetcode-cn.com/problems/add-two-numbers/description/ # # algorithms # Medium (33.48%) # Total Accepted: 103.1K # Total Submissions: 308K # Testcase Example: '[2,4,3]\n[5,6,...阅读全文

博文 2019-03-26 02:34:42 gsyk

图解Go的channel底层原理

废话不多说,直奔主题。 ## channel的整体结构图 ![](https://i6448038.github.io/img/channel/hchan.png) 简单说明: + ``buf``是有缓冲的channel所特有的结构,用来存储缓存数据。是个循环链表 + ``sendx``和``recvx``用于记录``buf``这个循环链表中的~发送或者接收的~index + ``lock``是个互斥锁。 + ``recvq``和``sendq``分别是接收(<-channel)或者发送(channel <- xxx)的goroutine抽象出来的结构体(sudog)的队列。是个双向链表 源码位于``/runtime/chan.go``中(目前版本:1.11)。结构体为``hchan``。 ...阅读全文

博文 2019-04-15 11:21:00 RyuGou

redis 基础数据类型

redis 基础数据类型Sting类型 :Redis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图中所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M。操作命令:set key valueget keyexists keydel key批量设置mset key1 value1 key2 value2 key3 value3mget key1 key2 key3过期设置expire key1 5 5秒后过期sete...阅读全文

博文 2018-08-03 16:34:53 walle_tang

使用Golang实现双向环形链表

**什么是双向环形链表?** `双向环形链表`属于线性表的其中一种结构,也被称为双向循环链表,以下是根据个人的理解使用Golang编写的一个`环形双向链表`,通过这种数据结构能够能够实现大量数据记录在内存中的CURD而不需要通过数据库。双向环形链表也可以解决约瑟夫问题(但一般选用单向环形链表解决) **实现步骤1:定义双向链表结构体** ```go //双向环形链表数据结构 package pkg import ( "fmt" ) //双向环形链表结构体 type CircleLink struct { Id int //节点索引 Data interface{} //data域,用于维护数据 prev *CircleLink //prev域 next *CircleLink //next域...阅读全文

博文 2018-08-30 11:10:32 JimPang

面试:反转链表

题目:反转链表 要求:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制: 0 <= 节点个数 <= 5000 反转链表算是面试中比较常见的一个关于链表的题,整体上难度不大,但如果你能掌握多种的解法,往往可以让面试官眼前一亮 注意提醒一点,在面对链表的面试题时,建议多画一下图理解一下 解法1:简单双指针 通过双指针,遍历 head 指针,通过中间变量,逐步指向新的 head 节点,完成链表反转 /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *L...阅读全文

博文 2020-03-01 21:32:38 若鱼治水

golang实现LRU算法

LRU缓存淘汰算法LRU是最近最少使用策略的缩写。双向链表实现LRU将Cache的所有位置都用双链表连接起来,当一个位置被访问(get/put)之后,通过调整链表的指向,将该位置调整到链表尾的位置,新加入的Cache直接加到链表尾。这样,在多次操作后,最近被访问(get/put)的,就会被向链表尾方向移动,而没有访问的,向链表前方移动,链表头则表示最近最少使用的Cache。package main import ( "fmt")type Node struct{ Key interface{} Value interface{} pre *Node next *Node}type LRUCache struct { limit int HashMap map[interface{}]*Nod...阅读全文

博文 2020-03-18 11:32:52 永明_3c16

2019-08-22【LeekCode题库problem-2】

GitHub 地址:coffeeTu-code LeekCode 地址:题库 Language:Golang /* @题目 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 @示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 @题目大意 2 个逆序的链表,要求从低位开始相加,得出结果也逆序输出,返回值是逆序结果链表的头结点。 @解题思路 需要注意的是各种进位问题。 极端情况,例如 Input...阅读全文

博文 2019-08-23 04:32:48 CoffeeRabbit

go公链实战0x03数据持久化

上一节学习了基于go语言的数据库boltDB的基本使用,这一节用boltDB实现区块链的数据持久化。 存储方式 区块链的数据主要集中在各个区块上,所以区块链的数据持久化即可转化为对每一个区块的存储。boltDB是KV存储方式,因此这里我们可以以区块的哈希值为Key,区块为Value。 此外,我们还需要存储最新区块的哈希值。这样,就可以找到最新的区块,然后按照区块存储的上个区块哈希值找到上个区块,以此类推便可以找到区块链上所有的区块。 区块序列化 我们知道,boltDB存储的键值对的数据类型都是字节数组。所以在存储区块前需要对区块进行序列化,当然读取区块的时候就需要做反序列化处理。 没什么难点,都是借助系统方法实现。废话少说上代码。 序列化 //区块序列化 func (block *Block...阅读全文

博文 2018-06-24 20:34:39 chaors

两数相加

两数相加 题目 来自: https://leetcode-cn.com/problems/add-two-numbers/ 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 Go编程实现 思路:迭代计算每位数字的和,记录进位。当全部数位和进位计算完毕,结果得到。 代码如下: // 单向链表结构 type ListNode struct { Val i...阅读全文

博文 2019-11-04 22:33:32 aside section._1OhGeD

Go语言 模板的使用(二)

判断 {{if .Attended}} 如果Attended是true的话,这句是第二行 {{else}} 如果Attended是false的话,这句是第二行 {{end}} 循环 我们可以使用range命令来循环一个数组或者链表中的元素。所以要获取 Emails 数组的信息,我们可以这么干 {{range .Emails}}...{{end}} {{with .Jobs}}{{range .}}An employer is {{.Employer}}and the role is {{.Role}}{{end}}{{end}} 变量 template包,允许您定义和使用变量。这样做的动机,可能我们会考虑通过把他们的名字当做电子邮件地址前缀打印出来。我们又使用这个类型 type Person...阅读全文

博文 2016-02-01 17:00:01 project

撮合引擎开发:完结篇

欢迎关注「Keegan小钢」公众号获取更多文章 撮合引擎开发:开篇 撮合引擎开发:MVP版本 撮合引擎开发:数据结构设计 撮合引擎开发:对接黑箱 撮合引擎开发:解密黑箱流程 撮合引擎开发:流程的代码实现 撮合引擎开发:缓存和MQ 撮合引擎开发:日志输出 撮合引擎开发:完结篇 本小节是该系列文章的最后一篇了,将讲解剩下的一些东西,包括交易委托账本中订单队列的实现逻辑、更多订单类型的实现逻辑。另外,不少朋友在问,完结后所有代码是否会开源放上 Github?我只能说,长期大概率会开源,但短期内还没打算开源。 订单队列 交易委托账本其实就是由两个订单队列组成的,一个买单队列,一个卖单队列。任何对交易委托账本的查询和操作,实际上都是查询和操作这两个队列。订单队列的设计也直接影响了撮合的性能,前面文章讲...阅读全文

博文 2019-12-05 10:34:16 Keegan小钢

深入理解GO语言之内存分配

前言:开通专栏后的第一篇文章,接下来将会就GO语言的内存,GC,并发编程等,深入理解GO这门语言。 一,内存模型概述 首先明确几个概念:(1) cache:线程私有的,每次对象分配时候先从cache查询,小对象如果能获得空闲内存则不用加锁了。来看看cache的结构(省略了跟gc等相关的字段)type mcache struct { alloc [numSpanClasses]*mspan // 用于分配的span spanclass spanClass // size class and noscan (uint8) }阅读源码我们可以看到cache有一个0到n的数组,每个数组挂载着一个链表,链表的节点代表着一个内存单元,而且同一个链表的节点的内存块都是相等的,不同链表内存大小不同(大小根据...阅读全文

博文 2017-10-30 01:16:08 wacxt

mysql

1、mvcc 多版本控制(可重复读隔离级别) 在Mysql中MVCC是在Innodb存储引擎中得到支持的,Innodb为每行记录都实现了三个隐藏字段: (1)、事务ID(DB_TRX_ID 6-byte ):最新插入或修改行的事务ID,删除是特殊的修改,会有1bit标示;InnoDB内部维护了一个递增的tx id counter,其当前值可以通过show engine innodb status获得 (2)、回滚指针(DB_ROLL_PTR 7-byte):指向回滚日志的undo log (3)、隐藏的ID 6-byte ![image.png](https://static.studygolang.com/180928/447becae50d66a1290338e931ff53172.pn...阅读全文

博文 2018-09-28 11:26:56 lobo

自己动手用Golang实现约瑟夫环

继上一篇单向链表,单线链表可以进一步扩展为环,如下图所示:特点:1、第一个节点称为头部节点,最后一个节点称为尾部节点2、每个节点都单方面的指向下一个节点3、尾部节点下一个节点指向头部节点题目:17世纪的法国数学家加斯帕讲了这样一个故事: 15个教徒和15 个非教徒,在深海海上遇险,必须将一半的人投入海海中,其余的人才能幸免于难,于是想了一个办法: 30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海海的都是非教徒。这就是典型的约瑟夫环问题,可以用单向链表环解决,具体代码如下:package main import "fmt" type LinkNode struct { Data interface{} ...阅读全文

博文 2019-12-29 22:33:46 筑梦攻城狮

《深入理解计算机系统》读书笔记

程序的机器级表示 程序编码 编译 编译时,提高优化级别,可以提高运行速度,但是编译时间会更长,对代码调试会更困难 编译过程 graph LR A(C预处理器扩展源代码)-->B(编译器产生两个文件的汇编代码) B-->C C(汇编器将汇编代码转变为二进制目标代码)-->D(链接器将目标文件与标准Unix库函数合并,产生最终的可执行文件) 汇编代码与目标代码 汇编代码接近于机器代码,目标代码是二进制格式,汇编代码的特点是,可读性很好的文本格式表示 数据格式 Intel用术语"字(word)"表示16位数据类型,因此称32位为双字,64位为4字 优化程序性能 编写高效程序 选择一组最好的算法和数据结构 编写出编译器能够有效优化以转换成高效可执行代码的源代码 编译技术 与机器有关:依赖机器的低级细...阅读全文

博文 2018-07-02 08:34:49 tomorrowwu

关于Golang和JVM中并发模型实现的探讨

说起来貌似有好久没有更新过博客了,主要是因为最近一段时间都在各种看书和看源码,所做的记录大部分也都是属于读书笔记性质,所以就没有整理到博客上来,之后会陆续整理一些东西上来。 引子 话说最近终于决定把之前收藏了很久的mit-6.824课程的lab拿出来做一下,这门课最有价值的地方就在于它设计了一些列的lab,让你能够在一定程度可控的工作量的coding之后比较深入地体会到众多分布式程序中所面临的一些列公共的问题以及如何去解决它们。例如,分布式容错、并发、网络底层实现等等。这门课的targeted language是golang。原因自然不说,因为golang的简洁所以非常适合用来替代C++等语言来作为lab的实现语言。 在实现的过程当中,我遇到的一个最主要的问题就是,如何在CPU密集型任务、I...阅读全文

博文 2016-08-19 11:00:11 tantexian