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

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

记浅析开源电商框架《flamingo-commerce》

初识 开源地址:https://github.com/i-love-flamingo/flamingo-commerce 首先我们看看效果 官方示例:https://demoshop.flamingo.me 我部署的示例:http://www.itfan.top:3210 尝试自己部署 提供了DEMO,地址:https://github.com/i-love-flamingo/commerce-demo-carotene 我部署的过程(略显坎坷) 踩过的坑: 首先我使用阿里云服务器(国内节点),搭建环境,包括golang、nodejs(当前最新版);部署的过程中发现版本不兼容,回退go(v1.13.6)、node(v12.16.3) 报错 Get https://accounts.googl...阅读全文

博文 2020-05-10 19:33:10 Ralap_

学习go语言

在je上看见帖子,google出了go语言,跟着贴子看来一圈也没看明白什么意思,实例程序看着到是挺简单,但是不知道怎么运行,运行环境在哪弄,也看有人写了go的一个程序,看来也没有看懂怎么运行。希望关注go的朋友多交流一下,也请高手指导指导我们这些初级程序员,接触了写语言,都是接触的不深,现在go刚出来,我想这次能够学的扎实一点。如果有写了go程序的,请跟大家分享一下,开发工具啊,安装上的问题,以及如何运行等,感谢分享知识的所有...阅读全文

博文 2014-10-04 19:26:02 horseroad

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语言程序设计》第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

Golang ...T 的几种用法

在Go中,经常可以见到 …T 能概括一下什么场合会用到…T吗 用在函数参数中 若函数的最后一个参数是…T类型,这个参数可传入任意个T类型的参数,在函数中…T的类型为[]T. 在这个例子函数中,你可以这样使用这个函数Sum(1,2,3)orSum(). func Sum(nums ...int) int { res := 0 for _, n := range nums { res += n } return res } 用在解序列 可以传入一个slice,然后用…解开它,注意在这里没有新的slice被创造。在这个例子函数中,我们把slice传入Sum函数 primes := []int{2, 3, 5, 7} fmt.Println(Sum(primes...)) // 17 在append...阅读全文

博文 2019-04-13 14:34:41 一根薯条

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

[BFS/DFS]HOJ2581Go

传送门:Go Go My Tags (Edit) Source : Stanford Programming Contest 2007 Time limit : 1 sec Memory limit : 64 M Submitted : 201, Accepted : 117 In the game of Go, two players alternate placing black and white stones on lattice points of an n * n grid, each attempting to surround as much territory(i.e., regions of unfilled lattice points) as possible. At...阅读全文

博文 2015-12-23 04:00:00 u010160562

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

go语言协程认识-1

//关于go语言协程通道的使用 //1.通道可以带缓存,也可以不带 //2.不带缓存的,不管是读还是写都会阻塞 //3.带缓存的,如果缓存溢出,就会阻塞 //4.make(chan int,1)和make(chan int)是不一样的,第一种通道内写入两个数据会阻塞,第二种写入就会阻塞 //5.如果协程在阻塞,但是主程已经退出执行,则认为程序死锁 //6.如果程序除了主程之外(没有一个协程),处于阻塞状态,则认为程序死锁 //7.一句话:只有一个协程(可以是主程),在阻塞,认为程序处于死锁 //8.子程序是协程的一种特例,阻塞到子程序执行完毕返回,而协程可能等不到执行完毕就返回,然后条件满足再回来执行 package main import ( "fmt" ) func main() { /...阅读全文

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

日记

放假第一天,手机上显示的是“06:47”,工作日叫不醒,周末起太早???然后还是磨蹭到9点起床,锅里是温的白粥,我说这是不是有点清淡,弟说你可以加点盐。我服。最后还是跑到隔壁镇的乐园面包买了个提子包,犹豫着要不要再买支维他奶,额还是隔壁美宜家买吧,你懂的。村口的东江大道真的有毒,每次过期或者中秋都会堵车,并不是车流大还是车祸而是道路施工,每年都是那个位置那个坑。今天还是不太想出门,在家继续学golang,看了一小时居然在沙发上睡着了,额头和背脊都是闷热的汗,屁股潮湿内裤紧贴着,赶紧开个空调回床上睡,这种迷迷糊糊慵懒的下午好想念了...阅读全文

博文 2018-09-22 23:34:43 徐E东

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

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 丁凯

依赖管理工具漫谈--从Maven,Gradle到Go

本文从Maven谈起,分析了Maven的主要思想以及Gradle对Maven的改进,最后谈了下Go语言面临的依赖管理问题。 为什么要有依赖管理工具? 谈依赖管理之前我们先谈谈为什么要有依赖管理工具这东西。 我们学了一种编程语言,然后写了个『Hello World』,然后宣称自己学了一门语言,这时候确实不需要关心依赖问题。 然而,当你要写一个稍微复杂点的应用,那怕就是留言板这样的,需要读写数据库,就需要依赖数据库驱动,就会遇到依赖管理的问题了。 再进一步,你写了一个库,想共享给别人使用,更需要了解依赖管理的问题。 当然,如果项目足够简单,你可以直接将依赖方的源码放置在自己的项目中,或者将依赖库的二进制文件(比如jar,dll)放置在项目的lib里。要提供给别人呢?把二进制包提供下载或者给别人传...阅读全文

为什么程序员都不喜欢使用switch而使用if来做条件跳

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

博文 2019-04-27 23:34:44 程序员之言

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

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

博文 2019-10-13 23:04:27 zhshch2002

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

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