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

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

go安装方法及安装脚本

从google网站的go下载页找到对应的包 本文参考自官方手册 http://golang.org/doc/install#download go在运行时会读取环境变量,如未读到相关环境变量,则按默认值运行 例如${GOROOT}为安装位置,如未正确设置,会无法使用。 在家目录(~)下的.bashrc文件最后加入以下内容 $ vi .bashrc #go安装的位置 export GOROOT=$HOME/go #类似工作空间 export GOPATH=$HOME/mygo #将bin目录加入环境变量 export PATH=${PATH}:${GOPATH}/bin:$GOROOT/bin #声明32位还是64位 export GOARCH=amd64 #声明操作系统类型 export G...阅读全文

博文 2016-03-09 00:00:01 S1234567_89

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

2017年教师节 本站功能升级

Go语言中文网祝广大的教师节日快乐! 今天本站做了两个功能升级: 1. 本站主题发布一段时间后是不能再修改的,为了方便对主题进行补充说明,增加了附言功能,在详情页可以看到附言按钮: ![image.png](https://static.studygolang.com/170910/9c1b320f1528e6bbdabb4bad1c2a397c.png) 2. 主题发布和回复,支持拖拽图片、QQ或微信等截图粘贴图片,直接插入 markdown 的图片语法,方便大家更快发布内容。上面的图片就是通过QQ截图,然后直接在该编辑框粘贴上传的。是不是很方便...阅读全文

聊聊 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

外链对网站优化的重要性和误区

网站优化分中比较重要的一环就是建设外链,外链可以快速提高一个网站的权重,那么外链是如何提高网站权重,从而获得高排名呢?搜索引擎初期是通过关键字匹配程度来排名的。但是这种方式有个严重的漏洞,就是很多人为了优化而优化,大量堆积关键字。为了解决这个问题,PageRank就是根据网站链接被引用次数作为判断一个网页权重的依据,如果一个网站被多个网站指向,那么搜索 引擎会认为这个网站具有较高的权威性,给予好的得分,所以权重就自然提高了。那么是不是只要是外链都可以获得好的权重呢?其实并不是这样的,只有高质量的外链才能获搜索引擎的认可,什么样的外链是高质量的?比如一个网站的首页链接,高质量文章内容中 引用的链接。首页权重是最高的。而且导出链接较少。一个首页链接要高于几十个内页链接。而且内页链接也必须看内容相...阅读全文

《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

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语言的分段栈

2013-12-02 再看Go语言的分段栈 再看Go语言的分段栈 Go语言1.2今天发布了,其中有一项改变是默认的栈大小从之前的4096增加到了8K。记得早些时候就有人提到这个代码改动,还提醒大家注意,说每条网络连接开一个goroutine现在消耗内存会翻倍了。当时没有认真想,就觉得好像是那么回事。并且也没有深究Go为什么会做出这个改动。 直到今天看到Go 1.3的路线,说下个版本中将会做出的一个重大的改动就是不再使用分段栈的设计。这下我才觉得应该好好审视一下Go语言的分段栈设计了。 第一个问题就是:4k还是8k? 最初Go将一个goroutine的初始栈大小定为4k,正好一个操作系统内存页的大小,这是一个并没有经过深思熟虑的设计。这个值的大小本来是应该跟据大多数goroutine运行时消耗...阅读全文

博文 2015-03-20 13:24:21 zenlife

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实现简单爬虫框架(1)——项目介绍与环境准备

最近学习Go语言,看了慕课网Google工程师深度讲解go语言这门课,现在把课程中的爬虫项目整理出来,同时也作为自己学习的一个总结。本人菜鸟一枚,如有任何问题,欢迎大家指正。 一、环境准备 1、go语言安装 Go安装包下载网址:https://studygolang.com/dl 选择对应的版本下载即可 Windows用户推荐使用msi安装,简单方便,而且会自动配置好环境变量 打开Windows中的命令提示符(cmd.exe)执行命令:go version查看go语言版本 2、环境配置 然后我们需要设置Go语言工作空间gopath目录(Go语言开发的项目路径) Windows 设置如下,新建一个环境变量名称叫做GOPATH,值为你的工作目录,例如GOPATH=D:Workspace 以上 %...阅读全文

博文 2019-05-21 22:34:40 jsfantasy

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

Golang语言——垃圾回收

垃圾回收涉及到:阈值触发,并行标记,并发清理。或者:定期强制回收,释放物理内存。垃圾回收效率总是Go版本升级的核心问题。阈值或强制回收如下图 1:并行标记如下图2:串行或与用户逻辑并发执行如下图3:如阈值过大,可能会导致长时间无法触发垃圾回收。因此,每 2 分钟强制检查回收是非常必要的。每 5 分钟,释放堆中长时间闲置块的物理内存。 此外,在类 UNIX 系统,通过建议操作系统内核解除内存映射的方式释放物理内存,但不回收虚拟内存。再次使用时,因缺页异常,由内核重新配物理内存。本文来自:CSDN博客感谢作者:notbaron查看原文:12.蛤蟆笔记go语言——垃圾回收 查看原文:http://www.zoues.com/2016/10/20/golang%e8%af%ad%e8%a8%80-%...阅读全文

博文 2016-10-20 07:00:02 u012798391

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

什么是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