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

GoLang-内存管理

一、tcmalloc介绍<参考资源> go的内存管理和tcmalloc(thread-caching malloc)很像,先看一下tcmalloc的实现。 1.1 简介 tcmalloc是google推出的一种内存分配器,常见的内存分配器还有glibc的ptmalloc和google的jemalloc。相比于ptmalloc,tcmalloc性能更好,特别适用于高并发场景。 1.2 tcmalloc算法策略 tcmalloc分配的内存主要来自两个地方:全局缓存堆和进程的私有缓存。对于一些小容量的内存申请使用进程的私有缓存,私有缓存不足的时候可以再从全局缓存申请一部分作为私有缓存。对于大容量的内存申请则需要从全局缓存中进行申请。而大小容量的边界就是32k。缓存的组织方式是一个单链表数组,数组的...阅读全文

博文 2020-02-03 03:32:41 帘外五更风

Go学习笔记-Channel最佳实践之基本规则【译】

channel[通道]是golang的一种重要特性,正是因为channel的存在才使得golang不同于其它语言。channel使得并发编程变得简单容易有趣。 channel的概念和语法 一个channel可以理解为一个先进先出的消息队列。channel用来在协程[goroutine]之间传递数据,准确的说,是用来传递数据的所有权。一个设计良好的程序应该确保同一时刻channel里面的数据只会被同一个协程拥有,这样就可以避免并发带来的数据不安全问题[data races]。 channel的类型 像数组、切片和字典一样,channel类型是一种组合类型,每一种channel类型都对应着一种简单的数据类型。比如元素的类型是string,那么对应的channel类型就是chan string,进...阅读全文

博文 2019-05-31 13:34:42 赵客缦胡缨v吴钩霜雪明

leetcode 25. k个一组翻转链表

题目描述 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。 示例: 给定这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5 说明: 你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 解题思路 1. 取链表的前K个节点,如果够K个节点,就截断后进行反转,不够K个节点,说明处理完了,return 2. 反转完前K个节点后,使用递归,处理后面的链表 代码实现 // ListNode Definition for singl...阅读全文

博文 2018-10-27 09:34:41 TomorrowWu

golang中container/ring包

ring包实现了环形双向链表的功能。 type Ring func New(n int) *Ring func (r *Ring) Do(f func(interface{})) func (r *Ring) Len() int func (r *Ring) Link(s *Ring) *Ring func (r *Ring) Move(n int) *Ring func (r *Ring) Next() *Ring func (r *Ring) Prev() *Ring func (r *Ring) Unlink(n int) *Ring 结构体: type Ring // 环形双向链表 type Ring struct { next, prev *Ring Value interface...阅读全文

博文 2018-12-08 13:34:43 laijh

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 10:02:43 link1st

关于切片

运行结果的第一行表示的是什么?还有,通过append函数赋值后,slice[0][0]和slice[0][1]的地址发生了改变,这样我对slice进行搜索时间不会变慢吗?slice是如何知道silce[1][0]的位置的,还是说slice其实是一个链表? ![TIM图片20171024233230.png](https://static.studygolang.com/171024/fa6e75d6ab3f01c617ea106dae17779b.png...阅读全文

如下方法执行得不到想要的结果,大概是想知道不定参数表怎么传参?

``` func All(str string,t ...interface{}) { sprintf := fmt.Sprintf(str,t); fmt.Println(sprintf) } func main() { All("123456%s%d","qqq",123) fmt.Print(fmt.Sprintf("123456%s%d","qqq",123)) } ``` >先后输出如下 123456[qqq %!s(int=123)]%!d(MISSING) 123456qqq123 >不定参数方法的在参数传入的时候,应该类似传一个数组进去?大约应该是要参数压栈len([])次? >貌似Java和Go都有这样的问题(我也就会这两...阅读全文

兄弟连区块链培训教程分享Go语言golang单链表实现

目前而言区块链是一门新兴前沿行业,但也是一门综合复杂性强的学科,学习区块链需要有一定的学习能力与知识基础。然而很多线下培训机构却只顾收取高额报名费用,将用户的实际情况置若罔闻,不设报名门槛,不对报名人员进行甄别筛选,实则是一种不负责任的态度。 兄弟连教育Go全栈与区块链培训课程已从多层面颠覆传统培训机构运营思维,区块链课程的开设在一定程度上加大了大众对这一专业领域的认知,其构建起的区块链世界也必将在未来为我们呈现更加高效的生活方式。package main//链表实现import ( "fmt" "os")//定义错误常量const ( ERROR = -1000000001)//定义元素类型type Element int64//定义节点type LinkNode struct {Data...阅读全文

博文 2018-08-31 15:37:29 兄弟连区块链培训

Golang 内存管理源码剖析

Golang 的内存管理基于 tcmalloc,可以说起点挺高的。但是 Golang 在实现的时候还做了很多优化,我们下面通过源码来看一下 Golang 的内存管理实现。下面的源码分析基于 go1.8rc3。 1.tcmalloc 介绍 关于 tcmalloc 可以参考这篇文章 tcmalloc 介绍,原始论文可以参考 TCMalloc : Thread-Caching Malloc。 2. Golang 内存管理 0. 准备知识 这里先简单介绍一下 Golang 运行调度。在 Golang 里面有三个基本的概念:G, M, P。 G: Goroutine 执行的上下文环境。 M: 操作系统线程。 P: Processer。进程调度的关键,调度器,也可以认为约等于 CPU。 一个 Gorou...阅读全文

博文 2018-06-04 11:33:05 万建宁

深入理解 Go defer

深入理解 Go defer 在上一章节 《深入理解 Go panic and recover》 中,我们发现了 defer 与其关联性极大,还是觉得非常有必要深入一下。希望通过本章节大家可以对 defer 关键字有一个深刻的理解,那么我们开始吧。你先等等,请排好队,我们这儿采取后进先出 LIFO 的出站方式... 特性 我们简单的过一下 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 EDDYCJY. 二、...阅读全文

博文 2019-06-16 16:59:49 EDDYCJY

兄弟连区块链教程eth源码解析区块数据结构

兄弟连区块链教程eth源码解析区块数据结构,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。在区块链中,区块是存储有价值信息的块。这是任何一种加密货币的本质。除此之外,区块还包含一些技术信息,比如它的版本、当前时间戳和前一区块的散列值(哈希值)Block(区块)是Ethereum的核心数据结构之一* 所有账户的相关活动,以交易(Transaction)的格式存储,每个Block有一个交易对象的列表* 每个交易的执行结果,由一个Receipt对象与其包含的一组Log对象记录* 所有交易执行完后生成的Receipt列表,存储在Block中(经过压缩加密)* 不同Bl...阅读全文

博文 2018-10-16 18:34:41 兄弟连区块链培训

Go cond 源码学习

概述 cond是go语言sync提供的条件变量,通过cond可以让一系列的goroutine在触发某个条件时才被唤醒。每一个cond结构体都包含一个锁L。cond提供了三个方法: Signal:调用Signal之后可以唤醒单个goroutine。 Broadcast:唤醒等待队列中所有的goroutine。 Wait:会把当前goroutine放入到队列中等待获取通知,调用此方法必须先Lock,不然方法里会调用Unlock()报错。 简单使用 创建40个goroutine都wait阻塞住。调用Signal则唤醒第一个goroutine。调用Broadcast则唤醒所有等待的goroutine。 package main import ( "fmt" "sync" "time" ) var l...阅读全文

博文 2019-08-02 18:02:48 大二小的宝

面试:从尾到头打印链表

题目:从尾到头打印链表 要求:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 题解1:递归法 因为是从尾到头返回每一个节点的值,所以很容易想到如果从最后的节点将值放入数组中,然后再往前逐步将数据放入数组,最后回到头节点返回即可,可以想到递归就能轻松做到,只要注意递归函数的结束条件即可。 /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func reversePrint(head *ListNode) []int...阅读全文

博文 2020-02-28 16:32:40 若鱼治水

Go基础系列:struct和嵌套struct

struct struct定义结构,结构由字段(field)组成,每个field都有所属数据类型,在一个struct中,每个字段名都必须唯一。 说白了就是拿来存储数据的,只不过可自定义化的程度很高,用法很灵活,Go中不少功能依赖于结构,就这样一个角色。 Go中不支持面向对象,面向对象中描述事物的类的重担由struct来挑。比如面向对象中的继承,可以使用组合(composite)来实现:struct中嵌套一个(或多个)类型。面向对象中父类与子类、类与对象的关系是is a的关系,例如Horse is a Animal,Go中的组合则是外部struct与内部struct的关系、struct实例与struct的关系,它们是has a的关系。Go中通过struct的composite,可以"模仿"很多...阅读全文

博文 2018-11-23 09:11:24 f-ck-need-u

golang 中的Interface 和 反射

基础知识在这里学习: 资源一 资源二 看完这些基本的估计都有点朦朦胧胧,好文章是值得读好几遍的,这里我写一些例子,用来快速上手。 reflect.Type 常用函数使用 type Type interface { Method(int) Method MethodByName(string) (Method, bool) NumMethod() int Name() string Size() uintptr String() string Kind() Kind Elem() Type Field(i int) StructField FieldByIndex(index []int) StructField FieldByName(name string) (StructField, b...阅读全文

博文 2019-03-26 20:34:48 YuWenHaiBo

leetcode 25. k个一组翻转链表

题目描述 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。 示例: 给定这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5 说明: 你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 解题思路 1. 取链表的前K个节点,如果够K个节点,就截断后进行反转,不够K个节点,说明处理完了,return 2. 反转完前K个节点后,使用递归,处理后面的链表 代码实现 // ListNode Definition for singl...阅读全文

博文 2018-10-27 09:34:38 tomorrowwu

golang优化日记

内存优化 1.1小对象合并成结构体一次分配,减少内存分配次数 c++里面,小对象在对上频繁申请,会出现内存碎片,导致大的对象时无法申请到连续的内存空间,一般建议使用内存池; go runtime底层使用内存池,但每个span大小为4k,同时维护一个cache;cache分为0到n的list数组,每个单元挂载一个链表,链表上每个节点的内存块大小是相等的;不同链表的大小块是不等的,当cache不够时再向spanalloc申请; 例如:小对象合并为结构体一次分配 for k,v := range m{ k,v := k,v go func(){ //using k,v }() } 替换为 for k,v := range m{ x := struct {k , v string} {k, v} g...阅读全文

博文 2020-05-06 11:34:27 安静的皮蛋

MySQL数据库的常用操作

学习python少不了和数据库打交道,常见的数据库有:MySQL、SQLite、MongoDB、Redis等,这里主要介绍一下MySQL数据库的基本操作。 数据库听起来感觉好高大上,当你接触之后有种恍然大悟的感觉,不就是把我们的数据存到一个表格中吗。可以简单的这么理解,大家都知道表格都是由表名、表头、数据等几部分组成的,数据库跟这类似,只不过叫法不一样,这里叫数据库名、表名和字段。数据库就简单介绍这么多,说的不一定完全正确,下面就说一下怎么操作数据库。 一、MySQL字段类型 常用的有:数值(int, float)、字符串(varchar, text)、日期(date, datetime) 二、MySQL约束 主键:primary key 外键:foreign key 默认值:default...阅读全文

博文 2018-11-30 16:44:21 Javaspring12

Go map原理剖析

在使用map的过程中,有两个问题是经常会遇到的:读写冲突和遍历无序性。为什么会这样呢,底层是怎么实现的呢?带着这两个问题,我简单的了解了一下map的增删改查及遍历的实现。 结构 hmap type hmap struct { // Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go. // Make sure this stays in sync with the compiler's definition. count int // 有效数据的长度# live cells == size of map. Must be first (used by len() builtin)...阅读全文

博文 2019-10-08 18:32:54 tyloafer

golang内存分配

Go语言内置运行时(就是runtime),不同于传统的内存分配方式,go为自主管理,最开始是基于tcmalloc架构,后面逐步迭新。自主管理可实现更好的内存使用模式,如内存池、预分配等,从而避免了系统调用所带来的性能问题。 1. 基本策略 每次从操作系统申请一大块内存,然后将其按特定大小分成小块,构成链表(组织方式是一个单链表数组,数组的每个元素是一个单链表,链表中的每个元素具有相同的大小。); 为对象分配内存时从大小合适的链表提取一小块,避免每次都向操作系统申请内存,减少系统调用。 回收对象内存时将该小块重新归还到原链表,以便复用;若闲置内存过多,则归还部分内存到操作系统,降低整体开销。 1.1 内存块 span:即上面所说的操作系统分配的大块内存,由多个地址连续的页组成; object:...阅读全文

博文 2019-12-28 19:02:49 33debug

QuickBI助你成为分析师-数据建模(一)

摘要: 创建数据集是报表分析的基础,合理建模可以达到事半功倍的效果哦! 产品核心流程第二步为创建数据集,进行数据建模,如果说数据是海,那么创建数据集并合理建模就是划船的浆,有了浆才能在数据的海洋里畅游。目前创建数据集有两种方式:(1)数据表直接创建数据集 (2)通过自定义sql创建数据集,以实现初步建模。 **创建数据集:** (1)直接新建数据集: 如下图,在数据源列表页,找到目标表,点击创建数据集按钮并选择存放文件夹 即可新建,新建后自动进入数据集界面。 ![图片描述](http://img.blog.csdn.net/20180409101738943?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWl...阅读全文

Golang链表

面试题25. 合并两个排序的链表 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 限制: 0 <= 链表长度 <= 1000 注意:本题与主站 21 题相同:https://leetcode-cn.com/problems/merge-two-sorted-lists/ 148. 排序链表 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->...阅读全文

博文 2020-05-04 19:32:45 DoneIsBetter

数据结构之跳表

跳表 前言 文中附代码实现. 在公众号回复 【跳表】 也可以获取哦。 什么是跳表 跳表是一种数据结构。它允许快速查询一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(log n),优于普通队列的O(n)。 from. 维基百科 引题 线性表这种数据有两种具体实现, 数组和链表。具体的内容之前的文章里也有说过,可以翻翻看哇~。在这里两种数据结构中,数组的优点是查找速度快,而链表的优点是增删的效率高,这也是我们常说的。其实,非也。 数组是一种内存连续的数据结构,其优点是可以通过首地址+N*(sizeOf(Node)) 来快速获取指定位置上的元素.假如我们不知道指定元素的位置呢? 链表是一种非内存连续的数据,其优点是通过改变指针地址来快速增减元素。很明显的问题,你首先要知道你要...阅读全文

博文 2020-01-06 23:32:47 方小白_

深入理解 Go panic and recover

深入理解 Go panic and recover 作为一个 gophper,我相信你对于 panic 和 recover 肯定不陌生,但是你有没有想过。当我们执行了这两条语句之后。底层到底发生了什么事呢?前几天和同事刚好聊到相关的话题,发现其实大家对这块理解还是比较模糊的。希望这篇文章能够从更深入的角度告诉你为什么,它到底做了什么事? 思考 一、为什么会中止运行 func main() { panic("EDDYCJY.") } 输出结果: $ go run main.go panic: EDDYCJY. goroutine 1 [running]: main.main() /Users/eddycjy/go/src/github.com/EDDYCJY/awesomeProject/ma...阅读全文

博文 2019-06-16 00:39:31 EDDYCJY

golang 容器的学习与实践

golang 提供了几个简单的容器供我们使用,本文在介绍几种Golang 容器的基础上,实现一个基于Golang 容器的LRU算法。 容器介绍 Golang 容器位于 container 包下,提供了三种包供我们使用,heap、list、ring. 下面我们分别学习。 heap heap 是一个堆的实现。一个堆正常保证了获取/弹出最大(最小)元素的时间为log n、插入元素的时间为log n.golang的堆实现接口如下: // src/container/heap.go type Interface interface { sort.Interface Push(x interface{}) // add x as element Len() Pop() inter...阅读全文

博文 2020-05-06 10:32:42 搬砖程序员带你飞

Go36-8-链表

链表 Go语言的链表实现在其标准库的container/list代码包中。 这个包包含了2个程序实体: List : 实现了一个双向链表 Element : 代表了链表中元素的结构 操作链表 移动链表里的元素: func (l *List) MoveBefore(e, mark *Element) // 把元素e移动到mark元素的前面 func (l *List) MoveAfter(e, mark *Element) // 把元素e移动到mark元素的后面 func (l *List) MoveToFront(e *Element) // 把元素e移动到链表的最前端 func (l *List) MoveToBack(e *Element) // 把元素e移动到链表的最后端 上面的方法都...阅读全文

博文 2019-01-06 13:35:21 骑士救兵

合并两个排序的链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路 1.仿照归并排序中merge的逻辑即可。 Java代码实现 public ListNode Merge(ListNode list1,ListNode list2) { ListNode p = new ListNode(-1); ListNode res = p; while(list1 != null || list2 != null){ int cur1 = list1 == null ? Integer.MAX_VALUE : list1.val; int cur2 = list2 == null ? Integer.MAX_VALUE : list2.val; if(cur...阅读全文

博文 2020-01-07 19:32:47 youzhihua

golang双链表的实现

双链表的实现 基本概念 每一个节点都存储上一个和下一个节点的指针 实现思路 创建一个节点结构体 每个节点都有上节点指针与下节点指针 每个节点都有一个key => value 创建一个链表结构体 链表容量大小属性 链表大小属性 链表锁, 实现并发安全 链表头节点 链表尾节点 实现链表操作方法 添加头部节点操作AppendHead 添加尾部节点操作AppendTail 追加尾部节点操作Append 插入任意节点操作Insert 删除任意节点操作Remove 删除头部节点操作RemoveHead 删除尾部节点操作RemoveTail 获取指定位置的节点Get 搜索任意节点Search 获取链表大小GetSize 打印所有节点操作Print 反转所有节点操作Reverse 总结 学好算法是一个不断积...阅读全文

博文 2019-08-12 11:32:44 百里

深入理解Go-goroutine的实现及Scheduler分析

在学习Go的过程中,最让人惊叹的莫过于goroutine了。但是goroutine是什么,我们用go关键字就可以创建一个goroutine,这么多的goroutine之间,是如何调度的呢? 1. 结构概览 在看Go源码的过程中,遍地可见g、p、m,我们首先就看一下这些关键字的结构及相互之间的关系 1.1. 数据结构 这里我们仅列出来了结构体里面比较关键的一些成员 1.1.1. G(gouroutine) goroutine是运行时的最小执行单元 type g struct { // Stack parameters. // stack describes the actual stack memory: [stack.lo, stack.hi). // stackguard0 is the ...阅读全文

博文 2019-09-01 23:32:48 tyloafer

通用抽奖工具之系统设计

前言 上篇文章《通用抽奖工具之需求分析》我们已经通过一些常见的抽奖场景,得到了符合这些抽奖场景的抽奖工具五要素: 抽奖五要素 要素名称 第一要素 活动 第二要素 场次 第三要素 奖品 第四要素 中奖概率 第五要素 均匀投奖 以及创建一个抽奖活动的5个基本步骤,如下: 活动配置 场次配置 奖品配置 奖品中奖概率配置 奖品投奖配置 上篇文章回顾 《通用抽奖工具之需求分析》 需求已经分析完了,今天我们就来看看这通用抽奖工具具体的设计,分为如下三个部分: DB设计 配置后台设计 接口设计 DB设计 第一要素活动配置的抽奖活动表: -- 通用抽奖工具(万能胶Glue) glue_activity 抽奖活动表 CREATE TABLE `glue_activity` ( `id` int(11) uns...阅读全文

链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点。 思路 设置一对快慢指针 2.快指针先走k步,若快指针没走完k步便为null,直接返回null即可 3.快慢指针同时移动,若快指针指向null,直接返回慢指针即可 Java代码实现 public ListNode FindKthToTail(ListNode head,int k) { ListNode fast = head; ListNode slow = head; while(k>0 && fast != null){ fast = fast.next; k--; } if(k>0){ return null; } while(fast != null){ slow = slow.next; fast = fast.next; } ...阅读全文

博文 2020-01-07 19:32:49 youzhihua

Golang数据结构 - 2 - 栈

栈 在上一部分中,我们用Go实现了最常用的数据结构-数组,并实现了数组的添加元素、删除元素、数组遍历、数组排序和数组查找等功能。 在数组中我们可以实现任意位置的添加或删除元素,但是在某些场景中,需要我们对数据的添加或删除进行进一步的限制,于是就有了栈和队列。本章将使用Go来实现栈和栈的一些基本功能。 栈是一种运算受限的线性表,对栈中数据进行操作的时候需要遵循后进先出(LIFO)原则。在栈中对元素进行入栈或出栈操作的一端叫作栈顶,另一端则为栈底。 本章中将基于Golang切片和链表两种实现方法来实现栈。 栈定义 首先定义栈接口,其中包含以下方法: Push(e ...Element):添加若干元素到栈顶 Pop() Element:弹出一个栈顶元素 Peek() Element:返回栈顶元素,...阅读全文

博文 2019-06-19 02:03:00 monigo

【数据结构原理与应用(Golang描述)】② 链表

_ _ _ _ _ _ _ | (_) | | | | | (_) | | | |_ _ __ | | _____ __| | | |_ ___| |_ | | | '_ \| |/ / _ \/ _` | | | / __| __| | | | | | | < __/ (_| | | | \__ \ |_ |_|_|_| |_|_|\_\___|\__,_| |_|_|___/\__| 1.1 原理 链表与数组都非常基础也非常常用,从底层数据结构上看,数组需要一块连续的内存空间来存储数据,而链表则不需要,链表通过指针将一组零散的内存块串联起来使用。 日常中有三种常见的链表结构: 单向链表 双向链表 循环链表 1.2 分析 对于单链表来说,插入和删除操作的时间复杂度为 $O(1)$。双向链表...阅读全文

博文 2020-02-07 13:32:39 vouv

深度解密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 key appe...阅读全文

博文 2019-06-03 23:32:41 Stefno

零基础学前端HTML+CSS

课程介绍 网页的本质就是超级文本标记语言HTML,我们这套课程从基础语法入门,讲解了HTML的常用标签,表单,排版等实用技术,同时深入讲解了CSS样式表的使用和如何使用DIV CSS设计网页布局。同时还介绍CSS3.0的新特性,阴影,圆角边框等实用案例。 课时列表 • 课时1:01互联网起源 • 课时2:02HTML概念 • 课时3:03标签 • 课时4:04HTML属性 • 课时5:05HTML固定基本结构 • 课时6:06第一个网页 • 课时7:07工具使用 • 课时8:08标题 • 课时9:09基本标签 • 课时10:10图像IMG标签 • 课时11:11路径概念 • 课时12:12超级链接 •...阅读全文

【数据结构原理与应用(Golang描述)】① 数组

.-. .- .-,.--..-,.--. \ \ / / __ | .-. | .-. | __ \ \ / / .:--.'. | | | | | | |.:--.'. \ \ / / / | \ || | | | | | / | \ | \ \ / / `" __ | || | '-| | '-`" __ | | \ ` / .'.''| || | | | .'.''| | \ / / / | || | | | / / | |_ / / \ \._,\ '|_| |_| \ \._,\ '|`-' / `--' `" `--' `" '..' GolangOnline Go tutorial 1.1 原理 数组(Array)是一种线性表数据结构,通过在内存中申请一组连续的存储空间,用于...阅读全文

HashMap原理摘要

HashMap介绍 HashMap是我们编程时经常会使用到的数据结构。这个数据结构的最大好处是能够帮助我们快速定位在内存中的某一个内容。 例如在Java中,我们快速取得Key所对应的值 //假设 map 是一个HashMap map.get("Key"); 原理 HashMap就是使用哈希函数将一个键映射到一个桶中,这个桶中就可能包含该键对应的值。 哈希函数 HashMap的关键就在于哈希函数的选择。哈希函数就将一个Key映射成一个序列的Index的操作。在Java中,哈希函数将Key这个对象,转换成一个数组的下标。 image.png 因为Key的集合往往远远大于我们保存数据的序列,所以哈希函数的的难度就在于需要将Key生成的这个Index尽量平均的分布在...阅读全文

Golang Iterator 设计

在学习《算法》这本书时,第一章有一个 Bag 的数据结构,它定义为不能删除元素的集合。之前看到一篇文章,说数据结构底层结构其实只有数组与链表,所以在实现 Bag 时想使用数组和链表分别实现。 但是在设计 Bag API 时发现,该如何提供一个通用的遍历方式给第三方调用?因为不像 Java,Golang 并未提供一个迭代接口,只是原生语法上支持对一些容器的遍历,如下所示: // 如果 container 是数组或者 Slice,那么 k => index,v => 数组元素; // 如果 container 是 Map,那么 k => key,v => value; for k, v := range container { } // 对于 channel 也是使用 range 方式,但是返回...阅读全文

博文 2020-04-07 22:32:43 Private

数据结构和算法(Golang实现)(26)查找算法-哈希表

哈希表:散列查找 一、线性查找 我们要通过一个键key来查找相应的值value。有一种最简单的方式,就是将键值对存放在链表里,然后遍历链表来查找是否存在key,存在则更新键对应的值,不存在则将键值对链接到链表上。 这种链表查找,最坏的时间复杂度为:O(n),因为可能遍历到链表最后也没找到。 二、散列查找 有一种算法叫散列查找,也称哈希查找,是一种空间换时间的查找算法,依赖的数据结构称为哈希表或散列表:HashTable。 Hash: 翻译为散列,哈希,主要指压缩映射,它将一个比较大的域空间映射到一个比较小的域空间。 简单的说就是把任意长度的消息压缩到某一固定长度的消息摘要的函数。Hash 算法虽然是一种算法,但更像一种思想,没有一个固定的公式,只要符合这种思想的算法都称 Hash 算法。 散...阅读全文

博文 2020-04-07 16:32:50 陈星星

值拷贝导致使用container/list出现的诡异问题分析

# golang值拷贝导致使用container/list出现的诡异问题分析 ## 先看正确使用list的两种方式 - 使用list.New() ```go package main import ( "container/list" "fmt" ) func main() { lPtr := list.New() lPtr.PushBack(1) for front := lPtr.Front(); front != nil; front = front.Next() { fmt.Println(front.Value) } } ``` 输出 ```go 1 ``` - 使用list.New() ```go package main import ( "container/list" "f...阅读全文

博文 2019-06-23 12:13:44 Nate-Ding

让我们一起啃算法----两数相加

两数相加(Add-Two-Numbers) 这是 LeetCode 的第二题,题目挺常规的,题干如下: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807来源:力扣 解题思路 这个题目的解法类似我们小时候算两个多位数的加法:从低位开始相加,大于等于10时则取值的个位数,并向前进1。只不过现在多位数用链表来表示了并且最后的值用链表返回了而已。 根据上面...阅读全文

博文 2020-04-20 15:33:51 三斤和他的朋友们

Handler 源码解析(Java 层)

从很早开始就认识到 Handler 了,只不过那时修为尚浅,了解的不够深刻,也没有应用自如。不过随着工作时间的增长,对 Handler 又有了更深层次的认识,于是有了这篇博客,希望尽可能的总结出多的知识点。 Handler 在 Java 层源码主要有 4 个类:Looper、MessageQueue、Message、Handler。我归纳了他们的几个主要知识点: Looper:sThreadLocal、Looper.loop();Message:数据结构、消息缓存池;MessageQueue:enqueueMessage、next、管道等待、同步消息隔离、idleHandler;Handler:send/post、dispatchMessage 消息处理优先级。LooperLooper 数据...阅读全文

博文 2019-04-28 13:58:31 demaxiya

Go 和 PHP 基于两组数计算相加的结果

文链接:go letcode,作者:三斤和他的喵 php 代码个人原创 两数相加(Add-Two-Numbers) 这是 LeetCode 的第二题,题目挺常规的,题干如下: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807来源:力扣 解题思路 这个题目的解法类似我们小时候算两个多位数的加法:从低位开始相加,大于等于10时则取值的个位数,并向前进1...阅读全文

博文 2020-04-16 20:32:42 hxd_

MySQL数据库入门学习

课程介绍 本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 课程目标 让小白也能够熟练掌握常用的数据库使用技巧,理解数据库的存储结构 适合人群 数据库入门学习者 前端学习者 课时列表 • 课时1: MySQL概要 • 课时2:MySQL在windows下的安装 • 课时3:MySQL在linux下的安装 • 课时4:MySQL在Mac下的安装 • 课时5:MySQL配置 • 课时6:添加和删除数据库(DB) • 课时7:数据类型 • 课时8:添加和删除数据表(table) • 课时9:给数据表添加或者删除列 • 课时10:修改某个数据列的名字或者数据类型 • 课时...阅读全文

golang 源码剖析(3): 内存分配

基本概念 基本策略: 先从操作系统申请一块大内存,以减少系统调用 将申请到的内存按照特定大小预先切成小块,构成一个链表 为对象分配内存时,只需从链表中取出一个大小合适的块使用就好 回收对象内存是,只需将对象放回原链表,以便服用 闲置过多时,会将部分内存归还系统,降低整体开销 内存块 分配器将其管理的内存块分成两种: span: 有多个地址连续的页(page)组成的大块内存 object: 将span按特定大小分成多个小块, 每个小块可存储一个对象 用途上来说,span面向的是内部管理,object面向的是对象的分配. 分配器按页数大小来区分不同大小的span。比如,以页数为单位将span存放到管理数组中,需要的时候就可以以页数为索引进行查找. 在runtime/sizeclasses.go中...阅读全文

博文 2020-03-05 03:32:47 darcyaf

深入理解Go-内存分配

Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理,最开始是基于tcmalloc,虽然后面改动相对已经很大了。使用自主管理可以实现更好的内存使用模式,比如内存池、预分配等等,从而避免了系统调用所带来的性能问题。 在了解Go的内存分配之前,我们可以看一下内存分配的基本策略,来帮助我们理解Go的内存分配 基本策略: 每次从操作系统申请一大块内存,以减少系统调用 将申请的大块内存按照特定大小预先切成小块,构成链表 为对象分配内存时,从大小合适的链表中提取一块即可 如果对象销毁,则将对象占用的内存,归还到原链表,以便复用 如果限制内存过多,则尝试归还部分给操作系统,降低整体开销 下面我们从源码角度来分析Go的内存分配策略有何异同 准备 在追踪源码之前,我们需要首先了解一...阅读全文

博文 2019-08-15 21:02:36 tyloafer

关于interface

Golang界面全面介绍 界面介绍 如果说够程和信道是转到并发的两大基石,那么接口是转到语言编程中数据类型的关键。在去语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是转到语言中所有数据结构的核心。 去不是一种典型的面向对象的语言,它在语法上不支持类和继承的概念。 没有继承是否就无法拥有多态行为了呢?答案是否定的,进入语言引入了一种新类型 - 接口,它在效果上实现了类似于C ++的“多态”概念,虽然与C ++的多态在语法上并非完全对等,但至少在最终实现的效果上,它有多态的影子。 虽然去语言没有类的概念,但它支持的数据类型可以定义对应的方法(或多个)。本质上说,所谓的方法(或多个)其实就是函数,只不过与普通函数相比,这类函数是作用在某个数据类型上的,所以在函数签名中,会有个接收器(接收...阅读全文

博文 2019-01-04 13:34:46 陈卧虫

day9 内核的malloc和free

今天看了下内核使用的malloc和free,受益颇丰,现在回想起来以前看golang的runtime中内存的管理部分感觉清晰了很多。linux0.11部分内核的方法名也叫malloc,之后的版本为了和用户程序的区分改成了kmalloc,但分桶思想大概相同 首先明确几个变量和数据结构 free_bucket_desc 这个是当前未使用的桶描述符的链表 _bucket_dir,通描述符目录,每个大小的通描述符的目录,其中size记录了桶的大小,bucket_desc是指向桶描述符的指针。每个bucket_desc都有next指针来组成一个链表 bucket_desc,关键对象,一个描述符被第一次使用的时候,会申请一页地址,并且根据该描述符所在的大小将该页切割成不同的块,每个块初始化的时候前4个字...阅读全文

博文 2018-12-12 14:34:46 柯基是只dog

自己动手用golang实现单向链表

单向链表特点:1、Head 节点 上一个节点为空2、Tail 节点下一个节点为空3、除Tail节点外,每个节点连接到下一个节点package main import ( "fmt" ) type LinkNode struct { Data interface{} Next *LinkNode } type SingleLink struct { head *LinkNode tail *LinkNode size int } // 初始化链表 func InitSingleLink()(*SingleLink){ return &SingleLink{ head:nil, tail:nil, size:0, } } // 获取头部节点 func (sl *SingleLink)GetHea...阅读全文

博文 2019-12-28 15:33:41 筑梦攻城狮

leetcode_21

Golang: 思路:这里可以取巧,拿到两个链表里所有的值,然后直接排序,用一个新的链表存一下并返回即可,但这种解法显然少了些营养。所以我们通过分别对两个链表进行比较,比较时,值小的那个被存进链表,然后该链表向后一格再做比较,直至某一条链表到达尾部。 func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { var head =&ListNode{Val:0} res:=head for{ if l1==nil{ res.Next=l2 break } if l2==nil { res.Next=l1 break } if l1!=nil&&l2!=nil{ if l1.Val>l2.Val{ test:=ListNode{Val:...阅读全文

博文 2020-01-25 03:32:53 淳属虚构