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

golng 使用postgres数据库

```go package main import ( "fmt" "log" "time" "github.com/go-xorm/xorm" _ "github.com/lib/pq" ) var engine *xorm.Engine func main() { } func init() { psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", "127.0.0.1", 5432, "postgres", "12345678", "postgres") var err error engine, err = xorm.NewEngine("postgres", ...阅读全文

博文 2018-01-19 13:27:18 hfyarvin

Go读取大量数据,开启多协程,将读取的文件内容导入数据库,出现丢失数据现象

各位大佬,Go新人,昨天写了一个数据库导入工具,从本地文件并导入DbFileReadWriteChanel的数据是正确无缺少的,就在开启100协程写入数据,执行完毕后,发现导入后的数据表中缺少了100多条。
\ 清空数据表后,又运行,一次还是缺少,然后进行少量的数据测试,发现,还是丢失,但如果只是使用主线程,导入,则无问题。
初步思考,代码出现问题的范围为一下代码块,请各位大佬协助,帮忙找一下问题所在,谢谢帮助。
``` //将存入chanel中的数据导入到数据库表中 func (this *DbFileRead) ImportTable(DbFileReadWriteChanel chan DbFileRead, exitChan chan bool) error {...阅读全文

Golang Web服务器自定义路由

What you are wasting today is tomorrow for those who died yesterday; what you hate now is the future you can not go back. 你所浪费的今天是昨天死去的人奢望的明天; 你所厌恶的现在是未来的你回不去的曾经。 最近公司有一个项目不算大,但是流量预计不小,分配到我这来了,要求快速上线,由于本人研究Golang两个多月(本人愚钝),加上对GOlang的痴迷,考虑偷偷的(其实是项目总监被我说服了)使用go来写web服务。 看到这我只能说,瞎扯淡啥!! 上菜: 首先自定义路由的前提是路由对象实现ServeHTTP方法 自定义路由写法一: 1. 路由结构体对象定义 type Router...阅读全文

博文 2018-01-09 15:33:21 90design

【面试题】从链表尾部算起,删除第n个节点

给定一个链表,从链表尾部算起,删除第n个节点,并返回链表头节点。 例如: > 给定列表:1->2->3->4->5,和 n = 2。 > 从尾部算起,删除第2个节点后,链表变为:1->2->3->5。 说明: 1. 给出的 n 总是有效的,比如不会出现负数。 2. 尽可能使用 O(n) 算法实现。 Go 示例定义: ```go /** * 定义一个单链表: * type ListNode struct { * Val int * Next *ListNode * } */ func removeNthFromEnd(head *ListNode, n int) *ListNode { } ...阅读全文

Go文章,gRPC合集,算法合集

**年初时**,朋友圈见到的最多的就是新的一年新的FlAG,年末时朋友圈最多的也是xxxx就要过去了,你的FLAG实现了吗? **这个公众号2016就已经创建了**,但截至今年之前从来没发表过文章,现在想想以前很忙,但更多的也是迷茫,想要写,不知道写点什么,或者写点东西出来了,自己看起来总觉得有点傻,2019年初,给自己立的FLAG是今年一定要把这个公众号运营起来,现在想起来,工作也多年了,有了一些积累,也有一点东西可写,另一个更多的是对自己的总结,分享自己的过程,所幸,今年坚持下来了,好多次想放弃,家人,朋友一直默默鼓励,读者也给我留言,希望一直努力、坚持,这里谢谢他们了。从一开始的写的比较简单,凌乱,慢慢的比较注重排版,注重读者阅读体验,注重质量,写作的过程,也是收获,成长的过程。...阅读全文

Go手动内存分配

2013-10-27 Go手动内存分配 Go手动内存分配 用Go的时候,有时候又想自己管理内存。所以决定写个手动内存管理的包吧。就当无聊练练手... 总体设计 两级分配。较大内存以页为单位分配,每页4k。分配出去的大块内存只能是1页,2页,3页...较小内存使用buddy算法结合分配池的方式进行分配。buddy算法主要是方便回收,对于各种不规则大小则分别维护一个free的链表。 整体上基本类似于Go本身使用的内存管理算法,除了没有引入垃圾回收标记信息,以及对小对象使用buddy分配算法。 buddy算法 管理结点使用的内存跟最小最大结点相关。如果最小单元太小,则浪费过多的管理结点。管理结点数目=最小单元数目*2 如果最大单元过大,则需要用更长的整型来记录大小,单个管理结点的大小增加。 bud...阅读全文

博文 2015-03-17 10:25:55 zenlife

Go gcache 源码分析(图解)

概述 gcache是一个用go实现的并发安全的本地缓存库。他可以实现如下功能: 指定缓存的的大小,初始化之时为cache设置size大小。 支持多种缓存的策略:Simple、LRU、LFU、ARC Simple:最普通的缓存策略,根据先存入的先淘汰。 LUR:Least Recently Used,意思是最近最少使用。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。 LFU:Least Frequently Used ,意思是最近最不常用。LFU Cache先淘汰一定时间内被访问次数最少的页面。 ARC:Adaptive Replacement Cache,ARC介于 LRU 和 LFU 之间。 支持多个回调函数 LoaderExpireFunc:过期回调函数 EvictedF...阅读全文

博文 2019-08-07 23:32:46 大二小的宝

详解Go语言的内存模型及堆的分配管理

前言 这篇文章主要介绍Go内存分配和Go内存管理,会轻微涉及内存申请和释放,以及Go垃圾回收。从非常宏观的角度看,Go的内存管理就是下图这个样子,我们今天主要关注其中标红的部分。 Go这门语言抛弃了C/C++中的开发者管理内存的方式,实现了主动申请与主动释放管理,增加了逃逸分析和GC,将开发者从内存管理中释放出来,让开发者有更多的精力去关注软件设计,而不是底层的内存问题。这是Go语言成为高生产力语言的原因之一。 我们不需要精通内存的管理,因为它确实很复杂,但掌握内存的管理,可以让你写出更高质量的代码,另外,还能助你定位Bug。这篇文章采用层层递进的方式,依次会介绍关于存储的基本知识,Go内存管理的 “前辈” TCMalloc,然后是Go的内存管理和分配,最后是总结。这么做的目的是,希望各位能...阅读全文

博文 2019-08-05 23:04:24 零壹技术栈

leetcode 206 反转链表

题目描述 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 解题思路 详见代码 代码实现 // ListNode Definition for singly-linked list. type ListNode struct { Val int Next *ListNode } func reverseList(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } var prev *ListNode cur := head for cur != nil...阅读全文

博文 2018-10-23 14:34:43 tomorrowwu

golang 1.2.1在生产环境中应用应该注意的问题

golang 1.2.1的GC因为算法的问题,在实际应用过程中,对于长时间运行的daemon程序,确实很容易导致内存泄露,有人用cgo来手动管理内存,也有人用pool来管理buffer,这些都很麻烦,还是等1.3发布吧,在 golang 1.2.1中,如果注意一些坑,还是很容易写出稳定运行的程序。 1. 避免递归; 2.在for里面,把一些每次重复的操作提到外面,比如包的init方法中执行, 这些不必多说,比如初始化一个数据库连接,regexp.Compile等; 3. 函数返回,对于slice本身是引用传递,struct等比较大的对象,用指针,在for循环里面用完将指针赋值为nil,这一点非常重要; The garbage collector will collect memory you...阅读全文

博文 2014-10-04 19:26:11 u013834131

Go:如何利用符号表

![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-hwo-to-take-symbol-table/cover.png) > Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French. ℹ️ *本文基于 Go 1.13。* 符号表是由编译器生成和维护的,保存了与程序相关的信息,如函数和全局变量。理解符号表能帮助我们更好地与之交互和利用它。 ## 符号表 Go 编译的所有二进制文件默认内嵌了符号表。我们来举一个例子并研究它。下面是代码: ```go va...阅读全文

博文 2020-05-31 20:20:27 lxbwolf

java 刷题感受

java 刷题基础知识 写在前面 lintcode 与 leetcode 刷题的好处:只关心功能的实现,不用处理相应的输入和输出。 对于大多数程序员而言这个功能非常好,处理输入和输出有时候也需要消耗一定的时间,尤其遇到golang这种特例的时候。 刷题需要掌握的基本知识点如下: java 数组、list及初始化 java 对象的引用和指针 treeNode java int最大值最小值表示法 lintcode 图论问题举例 java 数组及list,初始化 这些虽然简单,但是一般总会各种语言的初始化、定义混淆掉。这里做一个简单的记录: int a[] = {6,4,4,2,1}; //or int b[] = new int[10]; 链表: ArrayList fibLi...阅读全文

博文 2017-07-15 04:06:27 bradyjoestar

HashMap 内部原理

HashMap 内部实现 通过名字便可知道的是,HashMap 的原理就是散列。HashMap内部维护一个 Buckets 数组,每个 Bucket 封装为一个 Entry 键值对形式的链表结构,这个 Buckets 数组也称为表。表的索引是 密钥K 的散列值(散列码)。如下图所示: 这里写图片描述 链表的每个节点是一个名为 Entry 的类的实例。 Entry 类实现了 Map.Entry 接口,下面是Entry类的代码: private static class Entry implements Map.Entry { final K key; final int hash; V value;...阅读全文

golang map的底层实现

golang map的底层实现 粗略的讲,Go语言中map采用的是哈希查找表,由一个key通过哈希函数得到哈希值,64位系统中就生成一个64bit的哈希值,由这个哈希值将key对应到不同的桶(bucket)中,当有多个哈希映射到相同的的桶中时,使用链表解决哈希冲突。 hash函数 首先要知道的就是map中哈希函数的作用,go中map使用hash作查找,就是将key作哈希运算,得到一个哈希值,根据哈希值确定key-value落在哪个bucket的哪个cell。golang使用的hash算法和CPU有关,如果cpu支持aes,那么使用aes hash,否则使用memhash。 数据结构 hmap可以理解为 header of map的缩写,即map数据结构的入口。 type hmap struc...阅读全文

博文 2020-04-10 23:32:41 昔召阆梦

golang 实现单链表

package main //链表实现 import ( "fmt" "os" ) //定义错误常量 const ( ERROR = -1000000001 ) //定义元素类型 type Element int64 //定义节点 type LinkNode struct { Data Element //数据域 Nest *LinkNode //指针域,指向下一个节点 } //函数接口 type LinkNoder interface { Add(head *LinkNode, new *LinkNode) //后面添加 Delete(head *LinkNode, index int) //删除指定index位置元素 Insert(head *LinkNode, index int, d...阅读全文

博文 2017-02-10 10:29:25 赵雍

UCloud下一代VPC架构平滑演进方案和技术详解

前言2月27日,UCloud推出了下一代VPC网络(下面简称VPCng)。VPCng旨在解决客户网络使用场景中的痛点,如IP网段的自主规划、跨可用区容灾、VIP跨区高可用方案、混合云和公有云的无缝连接等。UCloud认为VPC(Virtual Private Cloud)是隶属于租户的虚拟网络。在虚拟网络中租户能完全掌控网络环境,自主管理所有的云服务资源,并能灵活扩展混合云能力,VPC的最终目标是给用户提供和传统网络完全一致的功能。这次推出的新特性如灵活的地址空间管理、VIP跨可用区都是业界首创。不过用户看不见的是,我们在后台服务做了大量工作,许多控制面和转发面的逻辑被重构。这些新功能不仅部署在新机房,UCloud在存量机房通过平滑升级,使得用户大量的已部署业务也能享受到这些新功能。存量机房...阅读全文

博文 2017-03-17 05:52:19 大爽兔

单向链表 golang

package main import "fmt" type Object interface {} //节点 type Node struct { data Object next *Node } //单向链表 type List struct { head *Node tail *Node size uint64 } //初始化 func(list *List) Init(){ (*list).size = 0 // 此时链表是空的 (*list).head = nil // 没有头 (*list).tail = nil // 没有尾 } //向尾部添加数据 func (list *List) Append(node *Node) bool { if node == nil { retu...阅读全文

博文 2018-01-19 00:30:00 lianming37

聊聊 Cache

title: 聊聊 cache tags: cache categories: Tech comments: true date: 2018-06-18 22:00:00 去年的时候在做系统性能优化的工作中,花费了大量的精力为业务定制化缓存方案,当时感觉尽善尽美了,但前些天不经意再聊起缓存时发现在一些细节上还欠考虑。在这里总结一下做 cache 需要考虑的问题。 大纲如下: 缓存模式 缓存淘汰 缓存击穿 缓存穿透 缓存雪崩 缓存模式 比较常见的模式有分为两大类: Cache-aside 以及 Cache-as-SoR。其中 Cache-as-SoR(System of Record, 即直接存储数据的DB) 又包括 Read-through、Write-through、Write-behin...阅读全文

博文 2018-06-20 20:34:40 zhaif

golang内存管理

几个关键数据结构 mspan 由mheap管理的页面,记录了所分配的块大小和起始地址等 mcache 与P(可看做cpu)绑定的线程级别的本地缓存 mcenter 全局空间的缓存,收集了各种大小(67种)的span列表 mheap 分配内存的堆分配器,以8kb进行页管理 fixalloc 固定尺寸的堆外对象空闲列表分配器,用来管理分配器的存储 内存分配逻辑 如果object size>32KB, 则直接使用mheap来分配空间; 如果object size<16Byte, 则通过mcache的tiny分配器来分配(tiny可看作是一个指针offset); 如果object size在上面两者之间,首先尝试通过sizeclass对应的分配器分配; 如果mcache没有空闲的span, 则向mc...阅读全文

博文 2019-08-09 00:32:55 SuperGopher

Go语言并发与并行学习笔记(三)

Go语言并发的设计模式和应用场景 以下设计模式和应用场景来自Google IO上的关于Goroutine的PPT:https://talks.golang.org/2012/concurrency.slide 本文的示例代码在: https://github.com/hit9/Go-patterns-with-channel 生成器 在Python中我们可以使用yield关键字来让一个函数成为生成器,在Go中我们可以使用信道来制造生成器(一种lazy load类似的东西)。 当然我们的信道并不是简单的做阻塞主线的功能来使用的哦。 下面是一个制作自增整数生成器的例子,直到主线向信道索要数据,我们才添加数据到信道 func xrange() chan int{ // xrange用来生成自增的整...阅读全文

《Go语言程序设计》第8章练习

8.1 班上有30个学生,每个学生的信息包括学号、姓名、性别、年龄、三门课的成绩。要求建立学生信息的结构体student,输入这30个学生的信息,然后打印输出各项数据。 8.2 有4名学生,每个学生包括学号、姓名、成绩,编写函数找出成绩最高学生的学号、姓名和成绩。 8.4 有一批图书,每本书有书名、作者、书号、出版日期4项数据,希望既可以通过书名查询,也可以使用作者或书名来查询图书。编写方法来实现此功能,如果查到,打印出此书的书名、作者、书号和出版日期信息。如果查不到此书,则打印出“无此书”。 8.5 有两个单链表a,b。设节点中包含学号、姓名。从链表a中删除所有与链表b中学号相同的节点...阅读全文

博文 2015-06-17 23:03:19 masm32v9

Golang语言基础教程:算术运算符

表达式:(a + b) * ca,b,c叫做操作数+,*,叫做运算符一、运算符1.1 算术运算符+ - * / %(求余) ++ --1.2 关系运算符== != > < >= <=1.3 逻辑运算符​1.4 位运算符​这里最难理解的就是^了,只要认为AB两者都相同的时候,为0,其他都为1假设A为60,B为13​1.5 赋值运算符​1.6优先级运算符优先级有些运算符拥有较高的优先级,二元运算符的运算方向均是从左至右。下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:​当然,你可以通过使用括号来临时提升某个表达式的整体运算优先级。———————————————————————————————————————————————————————出处:千锋教育go语言教研部作者:茹...阅读全文

Go数据结构之队列

一、什么是队列 数据结构里的队列就是模仿现实中的排队。如上图中狗狗排队上厕所,新来的狗狗排到队伍最后,最前面的狗狗撒完尿走开,后面的跟上。可以看出队列有两个特点:(1) 新来的都排在队尾;(2) 最前面的办理业务后离队,后面一个跟上。根据特点,计算机砖家就归纳以下队列结构。 队列简称FIFO,含义自己体会。二、队列的结构继续大卫哥的拆卸手。队列拆成容器和链表,分别用结构和单链表实现,如上图。三、接口说明及实现1、Init初始化队列,其实是初始化里面单链表。func (queue *Queue) Init() {lst := new(List)(*queue).list = lst lst.Init()} 2、Enqueue有尿的小狗狗排队。func (queue *Queue) Enqueu...阅读全文

博文 2017-11-27 10:04:55 懒人记

golang内存分配

http://www.cnblogs.com/yjf512/p/5147365.html 2016-01-21 10:09 by 轩脉刃, 173 阅读, 2 评论, 收藏, 编辑 golang内存分配 new一个对象的时候,入口函数是malloc.go中的newobject函数 func newobject(typ *_type) unsafe.Pointer { flags := uint32(0) if typ.kind&kindNoPointers != 0 { flags |= flagNoScan } return mallocgc(uintptr(typ.size), typ, flags) } 这个函数先计算出传入参数的大小,然后调用mallocgc函数,这个函数三个参数,第...阅读全文

博文 2016-01-21 22:00:02 zdy0_2004

2018.8.21求职者——区块链淘金

今天午休后,手机叮咚一声,打开一看,陌生人加好友的请求(来自某某技术社交的A)。点击通过后,便开始处理今天的工作,一直忙到九点一刻后,才与A开始畅聊。“hello~”我主动打招呼。“你好,在某某技术社交上看到你的微信。”A说到。“我是猎头,在给区块链公司招人,很高兴认识你。”我说到在一阵寒暄过后,我了解到他是一个刚刚毕业一年的年轻人,并且他在半年前就毅然放弃传统行业,来到一个充满未知却又充满机会的新领域(区块链)来寻找自己的机会。在和他聊天的过程中,感觉到他对新鲜事物的学习与探索欲非常大,是一个有目标有野心的年轻人。我们浅谈区块链的技术和未来无限的可能,在这一聊天过程中,他不断给我传递着他对这个新兴行业的肯定与看好。也让我一下回忆起之前接触过的一些对区块链反面态度的候选人,他们采用保守的态度...阅读全文

博文 2018-08-21 22:45:20 kelasong

Go 语言范围(Range)

Go 语言范围(Range)Go 语言中 range 关键字用于for循环中迭代数组(array)、切片(slice)、链表(channel)或集合(map)的元素。在数组和切片中它返回元素的索引值,在集合中返回 key-value 对的 key 值。实例package main import "fmt" func main() { //这是我们使用range去求一个slice的和。使用数组跟这个很类似 nums := []int{2, 3, 4} sum := 0 for _, num := range nums { sum += num } fmt.Println("sum:", sum) //在数组上使用range将传入index和值两个变量。上面那个例子我们不需要使用该元素的序号,所...阅读全文

博文 2016-02-23 16:00:11 u011225629

LRU 算法

LRU 最近最少使用算法,LRU算法主要用于缓存淘汰。主要目的就是把最近最少使用的数据移除内存,以加载其他数据。 原理 添加元素时,放到链表头 缓存命中,将元素移动到链表头 缓存满了之后,将链表尾的元素删除 LRU算法实现 可以用一个双向链表保存数据 使用hash实现O(1)的访问 groupcache中LRU算法实现(Go语言)https://github.com/golang/groupcache/blob/master/lru/lru.go 源码简单注释: package lru import "container/list" // Cache 结构体,定义lru cache 不是线程安全的 type Cache struct { // 数目限制,0是无限制 MaxEntries in...阅读全文

博文 2017-02-09 13:28:00 lidashuang

数据结构——Golang实现单链表

载请注明出处:数据结构——Golang实现单链表 Golang 1. 单链表 1.1. 定义 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点; 列表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指针。 1.2. 优点 单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小 结点的删除非常方便,不需要像线性结构那样移动剩下的数据 结点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表。 2. Golang 实现 2.1. 相关结...阅读全文

博文 2019-01-19 18:34:44 ChainZhang

大话图解golang map

前言 网上分析golang中map的源码的博客已经非常多了,随便一搜就有,而且也非常详细,所以如果我再来写就有点画蛇添足了(而且我也写不好,手动滑稽)。但是我还是要写,略略略,这篇博客的意义在于能从几张图片,然后用我最通俗的文字,让没看过源码的人最快程度上了解golang中map是怎么样的。 当然,因为简单,所以不完美。有很多地方省略了细节问题,如果你觉得没看够,或者本来就想了解详细情况的话在文末给出了一些非常不错的博客,当然有能力还是自己去阅读源码比较靠谱。 那么下面我将从这几个方面来说明,你先记住有下面几个方向,这样可以有一个大致的思路: 基础结构:golang中的map是什么样子的,是由什么数据结构组成的? 初始化:初始化之后map是怎么样的? get:如何获取一个元素? put:如何...阅读全文

博文 2019-06-10 17:33:01 LinkinStar

树莓派上小型 Linux 系统Gokrazy

Gokrazy 是用于树莓派上的一个小型 Linux 系统。长期以来我们因为在不同的树莓派上的 Linux 分发版维护带来的安全问题备受困扰。然后我们有了一个疯狂的想法,是否可以抛弃所有我们并不怎么需要的内存不安全的语言和软件。实际证明这个想法是可行的,于是就有了 Gokrazy。 Gokrazy 使用如下分区表...阅读全文

protobuf、LRU、sigleflight

失去了语法高量,更好阅读体验参见原文:https://www.cnblogs.com/cloudgeek/p/9497801.html今天咱一次讲3个吧,赶一下进度,好早点开始聊kubernetes!从groupcache的项目目录结构看,我们今天要学习groupcachepb、lru、singleflight这3个package:​一、protobuf 这个目录咋一看有2个文件:go和proto后缀的。proto后缀的文件和protocol buffers有关,所以先看看protocol buffers是什么吧。 在github上可以看到这个项目:https://github.com/google/protobuf google的,是不是瞬间来了兴趣? 官方介绍是:Protocol Buf...阅读全文

博文 2018-08-18 17:06:01 CloudGeek

PHP面试题2019年小米工程师面试题和答案解析

一、单选题(共29题,每题5分)1.PHP面向对象方法重写描述错误的是?A、子类必须继承父类B、子类可以重写父类已有方法C、重写之后子类会调用父类方法D、子类也可以具有与父类同名的属性,进行属性覆盖参考答案:C答案解析:重写之后子类不会再去调用父类的方法,而是直接调用自身的方法。2.php选项/信息函数作用错误的是?A、phpinfo() 输出关于 PHP 配置的信息B、php_sapi_name() 返回 web 服务器和 PHP 之间的接口类型C、ini_set() 为一个配置选项设置值D、ini_get() 获取所有配置选项参考答案:D答案解析:ini\_get() 是获取一个配置选项,获取所有配置选项的函数是ini\_get\_all()。3.下列说法错误的是:A、链表分为单向链表,...阅读全文

博文 2019-10-10 19:46:50 a993089249

七牛时间戳防盗链go语言实现

package main import ( "crypto/md5" "flag" "fmt" "net/url" "strings" ) func main() { var t int64 var key string var resUrl string flag.Int64Var(&t, "t", 0, "expire timestamp") flag.StringVar(&key, "key", "", "encrypt key") flag.StringVar(&resUrl, "url", "", "resource url") flag.Parse() if t == 0 || key == "" || resUrl == "" { return } expireTime := ...阅读全文

博文 2016-06-03 19:00:00 guoer9973

Go转型——数据结构初级(四)栈和队列

**1**.栈和队列 栈和队列是两种常用的线性结构,从数据结构角度来看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作实现性别操作的子集,他们是操作受限的线性表,因此也被称为限定的数据结构。但从数据类型角度来看,他们是和线性表大不相同。 **栈**:是限定仅在表尾进行插入或删除操作的线性表。对于栈来说,表尾一端有特殊含义,称为栈顶,相应的标头段称之为栈底。不含任何元素的栈被称作空栈。 假设S=(a(1),a(2),a(3),.......a(n)),我们称a(1)为栈底元素,a(n)为栈顶元素。进栈顺序应为a(1),a(2),a(3),.......a(n),退栈的顺序第一个元素应为栈顶元素。换句话说,栈的修改是按照后进先出的原则进行的,因此,栈又称之为后进先出线性表(简称LIFO结构)...阅读全文

博文 2018-01-24 17:04:03 yinshidaoshi

Go Slice与String内存布局和实现

上一篇提到的关于gc性能的问题,对比slice和map的结构可以看出为了存储数据map用了更多的内存空间,并且可能存在链表,链表的每个节点在gc时都做为一个小对象对待,增加了扫描的时间,因此gc时间相对更长。 slice初始化与复制slice通过内部指针和相关属性引用数组片段,来实现变长方案。实现方式和数据结构都类似C++中的vector。它本身是结构体,作为参数传递时传递的是slice本身而不是它引用的底层数组。len()可获得slice长度,cap()可获得slice容量。 12345type slice struct { array unsafe.Pointer len int cap int} slice可以通过数组初始化,也可以直接make。make时直接使用cap作为new的长度...阅读全文

博文 2017-12-18 14:17:33 nino's blog

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-06 11:33:05 万建宁

golang使用sync保证container/list链表线程安全

一边python,一边golang ! 时常因为工作切换语言造成了短路。container/list是golang语言内置的链表库。 对比其他语言的list,container/list该有的功能都有,就缺一个popLeft popRight方法。如果要实现pop方法需要去除value := list.Back() , 然后list.Remove(value) 。但这样不能保持操作的原子性。 解决的方法是用全局的互斥锁。 该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。 http://xiaorui.cc/?p=2923 下面是 container/list 包的基本用法. Python #xiaorui.cc func (e *Element) Next() ...阅读全文

博文 2017-04-04 19:27:10 rfyiamcool

golang 1.2.1在生产环境中应用应该注意的问题

golang 1.2.1的GC因为算法的问题,在实际应用过程中,对于长时间运行的daemon程序,确实很容易导致内存泄露,有人用cgo来手动管理内存,也有人用pool来管理buffer,这些都很麻烦,还是等1.3发布吧,在 golang 1.2.1中,如果注意一些坑,还是很容易写出稳定运行的程序。 1. 避免递归; 2.在for里面,把一些每次重复的操作提到外面,比如包的init方法中执行, 这些不必多说,比如初始化一个数据库连接,regexp.Compile等; 3. 函数返回,对于slice本身是引用传递,struct等比较大的对象,用指针,在for循环里面用完将指针赋值为nil,这一点非常重要; The garbage collector will collect memory you...阅读全文

博文 2015-06-17 20:01:43 LvanNeo

Golang通过邻接表实现有向图

本科学习数据结构的时候就听前辈说过,学好数据结构、计算机组成、操作系统和计算机网络后就会成为大神,我也使劲学过,但是一直没发现数据结构的用处。实际编程用过比较多的就是哈希表了,一般语言也都会通过一些扩展包支持。 《数学之美》第九章——《图论和网络爬虫》,就浅显易懂的介绍了图的实际用途。搜索引擎里面的网络爬虫抓取网络数据,就是把互联网抽象成有向图这种数据结构,通过遍历这张图实现的互联网抓取。 图一般分为有向图和无向图,一般用来开发网络爬虫和地图(我就知道这两个)。图可以认为是节点和连接边的集合,有两种实现方式:邻接表和邻接矩阵。稀疏图用邻接表实现,稠密图用邻接矩阵实现。图的重点在于遍历,有深度优先遍历和广度优先遍历。深度优先遍历可以通过递归实现,而广度优先遍历要转换成类似于树的层序遍历来实现。...阅读全文

博文 2017-02-09 12:25:22 Bryce

第一节 如何用Go实现单链表

一、概念介绍 下面这副图是我们单链表运煤车队。 每节运煤车就是单链表里的元素,每节车厢里的煤炭就是元素中保存的数据。前后车通过锁链相连,作为单链表运煤车,从1号车厢开始,每节车厢都知道后面拉着哪一节车厢,却不知道前面是哪节车厢拉的自己。第一节车厢没有任何车厢拉它,我们就叫它车头,第五节车厢后面拉其他车厢,我们称为车尾。 作为单链表它最大的特点就是能随意增加车队的长度,也能随意减少车队的长度。这是比数组公交车最大的优点。 二、Go语言实现讲解 1、节点每节车厢都由车体、绳索和煤炭构成。在Go语言中表示这种自定义组合体的类型就是结构,当然为了通用性,我们这里要把车厢转换成节点也就是元素,煤炭转换成数据,绳索转换成指针。 type Node struct { data Object next *N...阅读全文

博文 2017-10-27 07:04:53 懒人记

Go语言并发与并行学习笔记(三)

Go语言并发与并行学习笔记(三) Go语言并发的设计模式和应用场景 以下设计模式和应用场景来自Google IO上的关于Goroutine的PPT:https://talks.golang.org/2012/concurrency.slide 本文的示例代码在: https://github.com/hit9/Go-patterns-with-channel 生成器 在Python中我们可以使用yield关键字来让一个函数成为生成器,在Go中我们可以使用信道来制造生成器(一种lazy load类似的东西)。 当然我们的信道并不是简单的做阻塞主线的功能来使用的哦。 下面是一个制作自增整数生成器的例子,直到主线向信道索要数据,我们才添加数据到信道 func xrange() chan int{ ...阅读全文

博文 2014-10-25 21:00:01 yangzhengyi68

golang源码之map

一、概述 在golang中map类型是实际开发过程中经常使用到的数据类型,比如在微服务框架中存放[client,service]这样的映射,还有在实现长连接通信[client_id,connection],再例如rpc框架中[service_id, service_impl]等等。在其实际的定义中: 1、底层 map实际上是一个hashtable,存放的数据是被放置到一个数组buckets.每个bucket最多能够存放8个key/value对。而对应的数据则根据其hash(key)的bits低阶位来选择对应的bucket,而对应的高阶位则用来区分在同一个bucket中不同的key-value内容。一旦当前的bucket里面的键值对个数超过8个,则会通过链表的方式拓展其他的bucket。 2、...阅读全文

博文 2019-03-19 13:34:43 神奇的考拉

Go语言:正則表達式的使用

Go语言的正則表達式使用非常easy。演示样例代码: package test import ( "fmt" "regexp" ) func RegixBase() { //findTest() //findIndexTest() //findStringTest() //findChinesString() //findNumOrLowerLetter() findAndReplace() } //传入[]byte,返回[]byte func findTest() { str := "ab001234hah120210a880218end" reg := regexp.MustCompile("\\d{6}") //六位连续的数字 fmt.Println("------Find------...阅读全文

博文 2015-12-22 03:00:01 gcczhongduan

学生到课率监控系统(go_class_system)_ssh_sqlserver

超级管理员表创建语句如下: --超级管理员 create table t_admin( id int identity(1,1) primary key not null,--主键 username varchar(100),--超级管理员账号 password varchar(100)--超级管理员密码 ); insert into t_admin(username,password) values('admin','123456'); 辅导员表创建语句如下: --辅导员表注释 create table t_fdy( id int identity(1,1) primary key not null,--主键 username varchar(100),--账号(真实姓名) passwor...阅读全文

博文 2018-08-30 22:35:33 ruyadebcjs

[翻译] Go 1.3 链接器大修

Go team 总是能带来一些惊喜的,关于 Go 的链接器,看来在 1.3 版本中要大修了。 ————翻译分隔线———— Go 1.3 链接器大修 Russ Cox 2013 年 11 月 摘要 在构建和运行一个标准的 Go 程序时,链接器是最慢的一部分。为了解决这个问题,我们计划将链接器拆分到两部分。其中的一部分可能会用 Go 来编写。 背景 链接器总是 Plan 9 工具链中最慢的部分之一,而现在它是 Go 工具链中最慢的部分了。Ken Thompson 在关于工具链的概述中进行了总结: 新的编译器编译迅速、加载缓慢,生成中等质量的目标代码。编译器与移植性相关,对于不同的计算机需要若干星期的工作来构建对应的编译器。对于 Plan 9 来说,需要若干有特定功能、且使用自己的目标格式的编译器...阅读全文

博文 2014-10-09 16:19:59 mikespook

学生到课率监控系统(go_class_system)_ssm_oracle

超级管理员表创建语句如下: create table t_admin( id integer, username varchar(100), password varchar(100) ); insert into t_admin(id,username,password) values(1,'admin','123456'); --超级管理员字段加注释 comment on column t_admin.id is '主键'; comment on column t_admin.username is '超级管理员账号'; comment on column t_admin.password is '超级管理员密码'; --超级管理员表加注释 comment on table t_admi...阅读全文

博文 2018-08-31 19:35:33 ruyadebcjs

Golang网络:核心API实现剖析二)

---- *说明* ---- 前面的章节我们基本聊完了golang网络编程的关键API流程,但遗留了一个关键内容:当系统调用返回EAGAIN时,会调用WaitRead/WaitWrite来阻塞当前协程,现在我们接着聊。 -------------------- *WaitRead/WaitWrite* -------------------- func (pd *pollDesc) Wait(mode int) error { res := runtime_pollWait(pd.runtimeCtx, mode) return convertErr(res) } func (pd *pollDesc) WaitRead() error { return pd.Wait('r') } fun...阅读全文

博文 2017-12-14 14:05:50 丁凯

Golang实践----跳表

# 目录 - [跳表简介](#跳表简介) - [skipList](#skiplist) * [跳表示意图](#跳表示意图) * [跳表实现简要介绍](#跳表实现简要介绍) * [跳表使用介绍](#跳表使用介绍) * [github code](#github code) # 跳表简介 跳跃链表是对链表的改进,链表虽然节省空间,但是查找时间复杂度为O(n),效率比较低。 跳跃链表的查找、插入、删除等操作的期望时间复杂度为O(logn),效率比链表提高了很多。 跳表的基本性质 1. 有很多层结构组成 2. 每一层都是一个有序的链表 3. 最底层(level 0)的链表包含所有元素 4. 如果一个元素出现在level i的链表中,则在level i之下的链表都会出现 5. 每个节点包含两个指针,...阅读全文

博文 2019-07-02 23:47:43 GrassInWind2019

算法导论习题:10.2-7 in Go语言

10.2-7题:给出一个时间复杂度为O(n)的非递归过程,实现对一个含n个元素的单链表的逆转。 程序的主要思想就是,转变指标的指向,例如原本是1->2->3->4,现在变成1<-2<-3<-4,就实现了逆转 package main import ( "fmt" ) type Node struct { next *Node data int } type List struct { first *Node } func (l *List) Insert(d int) { node := &Node{nil, d} node.next = l.first l.first = node } func revise(l *List) { if l.first == nil { return } ...阅读全文

博文 2016-05-24 03:00:14 u013564276

golang实现LRU缓存淘汰算法

LRU缓存淘汰算法 LRU是最近最少使用策略的缩写,是根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 双向链表实现LRU 将Cache的所有位置都用双链表连接起来,当一个位置被访问(get/put)之后,通过调整链表的指向,将该位置调整到链表头的位置,新加入的Cache直接加到链表头中。 这样,在多次操作后,最近被访问(get/put)的,就会被向链表头方向移动,而没有访问的,向链表后方移动,链表尾则表示最近最少使用的Cache。 当达到缓存容量上限时,链表的最后位置就是最少被访问的Cache,我们只需要删除链表最后的Cache便可继续添加新的Cache。 代码实现 type Node struct { Key int Value i...阅读全文

博文 2018-12-26 17:34:45 caelansar