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

Go语言内存分配器-FixAlloc

昨天写了一篇Go语言内存分配器设计,记录了一下内存分配器的大体结构。在介绍内存分配器的核心实现前,本文先介绍一下内存分配器中一个工具组件——FixAlloc。FixAlloc称不上是核心组件,只是辅助实现整个内存分配器核心的一个基础工具罢了,由此可以看出FixAlloc还是一个比较重要的组件。引入FixAlloc的目的只是用来分配MCache和MSpan两个特定的对象,所以内存分配器中有spanalloc和cachealloc两个组件(见《Go语言内存分配器设计》的图)。MCache和MSpan两个结构在malloc.h中有定义。 定义在malloc.h文件中的FixAlloc结构如下,比较关键的三个字段是alloc、list和chunk,其他的字段主要都是用来统计一些状态数据的,比如分配了...阅读全文

博文 2014-11-13 21:58:14 skoo

golang实现直接插入排序算法

直接插入排序算法golang实现版本: 插入算法概要: 建立一个空的链表,首先在要排序的数组中随便拿出来一个数据,放在新建链表的开头,然后不停的从原数组中 获取数据,并和链表中的数据进行比较,大就放在链表的右端,小就放在链表的左端,一直循环直到结束为止, 排序完成。 package main import( "container/list" "fmt" ) var old []int = []int{432,432432,4234,333,333,21,22,3,30,8,20,2,7,9,50,80,1,4} func main(){ fmt.Println("old array:",old) res,_ := InsertionSort(old) i := 0 for e := res....阅读全文

博文 2014-10-04 19:26:08 rufidmx

Google HTML/CSS代码风格指南(中文版)

Google HTML/CSS代码风格指南 修正版本 2.1 背景 本文档定义了HTML/CSS的编写格式和风格规则。它旨在提高合作和代码质量,并使其支持基础架构。适用于HTML/CSS文件,包括GSS文件。 只要代码质量是可以被维护的,就能很好的被工具混淆、压缩和合并。 样式规则 协议 嵌入式资源书写省略协议头 省略图像、媒体文件、样式表和脚本等URL协议头部声明 ( http: , https: )。如果不是这两个声明的URL则不省略。 省略协议声明,使URL成相对地址,防止内容混淆问题和导致小文件重复下载。 ...阅读全文

博文 2015-06-18 18:07:58 chajn

使用CGO进行GC优化的注意事项

前阵子我利用cgo对游戏内存数据库的数据存储方式做了优化,减少了对象数量。但是程序放到线上环境后出现了段错误,直接导致进程退出,只好临时又把优化的部分去掉,去掉后程序又继续稳定运行了两周。 优化代码撤下来后,我重新整理了代码。整理下来,我觉得对含有字符串字段的表的优化逻辑太过复杂了,并且很难控制边界情况。 这里举个例子: type MyTable struct { Name string } func InsertMyTable(myTable MyTable) { nameLen := C.size_t(len(myTable.Name)) name := C.calloc(1, nameLen) C.memcpy(name, unsafe.Pointer((*reflect.String...阅读全文

博文 2014-10-13 20:37:36 达达

深入理解go的slice和到底什么时候该用slice

# 深入理解go的slice和到底什么时候该用slice ## 前言 用过go语言的亲们都知道,slice(中文翻译为切片)在编程中经常用到,它代表变长的序列,序列中每个元素都有相同的类型,类似一个动态数组,利用append可以实现动态增长,利用slice的特性可以很容易的切割slice,它们是怎么实现这些特性的呢?现在我们来探究一下这些特性的本质是什么。 ## 先了解一下slice的特性 * 定义一个slice ```go s := []int{1,2,3,4,5} fmt.Println(s) // [1 2 3 4 5] ``` 一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。...阅读全文

Go 实现常见数据结构

1. [二叉搜索树](https://flaviocopes.com/golang-data-structure-binary-search-tree) 2. [字典](https://flaviocopes.com/golang-data-structure-dictionary) 3. [图](https://flaviocopes.com/golang-data-structure-graph) 4. [哈希表](https://flaviocopes.com/golang-data-structure-hashtable) 5. [链表](https://flaviocopes.com/golang-data-structure-linked-list) 6. [队列](h...阅读全文

Go语言实战 - 网站性能优化第一弹“七牛云存储”

由于用户纷纷反应山坡网的打开速度比较慢,所以两天前我们决定把服务器从linode迁移到阿里云。 整个迁移过程非常平滑,基本上一个小时就完成了。而且阿里云的配套设施提供的也很不错,运行状态监控什么的都有。在此向大家推荐阿里云! 话说由于我们资金有限,就选择了ECS服务器中最低档的一款,512MB内存,2MB带宽。而山坡网上会有很多书籍封面图片,这导致了页面打开的速度并没有想象中提高的多,用户反应速度虽有提升,但不明显。 此时我想到了七牛云存储,虽说知道它已经几个月了,但始终没有正式开始用,总觉得我们挺穷的,云存储这类高端大气上档次的东西一时半会儿估计用不上。但还是抱着学习一下的心思打开它看了看。这一看我就乐疯了。 这……不敢相信啊!二话不说,立马决定把所有书籍封面图片都迁移到云端! 接着打开七...阅读全文

博文 2014-10-06 06:08:32 AllenDang

Go语言——内存管理

Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免内存碎片,提高内存利用率。 多线程:稳定性,效率问题。 内存分配 内存划分 arena即为所谓的堆区,应用中需要的内存从这里分配, 大小为512G,为了方便管理把arena区域划分成一个个的page,每个page为8KB,一共有512GB/8KB个页 spans区域存放span的指针,每个指针对应一个page,所以span区域的大小为(512GB/8KB) * 指针大小8byte = 512M bitmap区域大小也是通过arena计算出来512GB / (指针大小(8 byte) * 8 / 2) = 16G,用于表示arena区域中哪些地址保存了对象, 并且对象中哪些地址包含...阅读全文

博文 2018-10-25 17:34:51 陈先生_9e91

Python内置对象实现的方法及注意事项

![QQ截图20150928150103.png](http://studygolang.qiniudn.com/150928/e6361a28482c2d44561584940a75112b.png) Python语言中,所有的东西都是对象,因此对于python初学者来说,搞清楚python对象的具体实现非常重要。 Python中的对象主要分为类型对象和实例对象,但也不排除有同时属于类型和实例的对象,而不管是什么对象,除了内置的类型对象外,都存在于堆上,内置的类型对象则静态分配内存。下面我们就一起来看看python常见的内置对象及其实现方法吧。 1、int int这个对象比较简单,但还是需要重点了解,以便高效的实现。python首先有小整数对象。默认在[-5, 25...阅读全文

像Python那样跑go1的代码(Windows下双击运行)

Windows下,以".py"为扩展名的Python程序可以双击运行,用起来很爽,现在玩go语言,我也想这么玩…… 这里说说我的玩法。 示例代码(test.go): package main import ( "fmt" "time" ) func main() { fmt.Println("Test") time.Sleep(time.Duration(6) * time.Second) } Windows7 下,修改注册表: 路径:HKEY_CLASSES_ROOT\go_auto_file\shell\open\command 修改如下: "c:\go\bin\go.exe" run "%1" 现在在Windows下双击即可运行。比如示例代码的双击后运行效果: title为go.exe...阅读全文

博文 2014-10-04 19:26:49 MikeZhang

golang 队列和栈的实现

在 python 中实现队列或者栈非常简单,用list就可以用来做一个简单的栈和队列,如下 # 队列操作 queue = [] # 入队 由于有append 我们从列表尾入队 列表头出队 queue.append(1) queue.append(2) queue.append(3) # 现在队列的情况是[1,2,3],可以用list的pop方法出队 queue.pop(0) # 栈的操作跟队列类似 stack = [] # 入栈 stack.append(1) # 出栈和队列的区别在于 都是在列表尾部操作 stack.pop() 那么,在 golang 中我们要怎么实现这种简单的队列和栈呢。这个基本和 python 很类似。 // 初始化 var queue []int var stack ...阅读全文

博文 2019-05-25 00:34:39 咔叽咔叽_

GO-struct结构体

一、struct的特点 1、用来自定义复杂数据结构 2、struct里面可以包含多个字段(属性) 3、struct类型可以定义方法,注意和函数的区分 4、struct类型是值类型 5、struct类型可以嵌套 6、GO语言没有class类型,只有struct类型 二、struct的定义 1、struct声明: type 标识符 struct { Name string Age int Score int } 2、struct 中字段访问:和其他语言一样,使用点 例子 type Student struct { Name string Age int Score int } func main(){ var stu Student stu.Name = "lilei" stu.Age = 22...阅读全文

博文 2018-01-12 00:30:01 willpower-chen

Go 中 Queue 的实现方式

需求队列的特性较为单一,基本操作即初始化、获取大小、添加元素、移除元素等。最重要的特性就是满足先进先出。实现接下来还是按照以前的套路,一步一步来分析如何利用Go的语法特性实现Queue这种数据结构。定义首先定义每个节点Node结构体,照例Value的值类型可以是任意类型,节点的前后指针域指针类型为nodetype node struct { value interface{} prev *node next *node } 继续定义链表结构,定义出头结点和尾节点的指针,同时定义队列大小size:type LinkedQueue struct { head *node tail *node size int } 大小获取队列大小,只需要获取LinkedQueue中的size大小即可:func ...阅读全文

博文 2017-09-27 03:29:26 allenwu.itscoder.com

【golang】HashMap原理和实现

理 我们都知道怎么使用goLang中的map来存储键值对类型的数据,但是它的内部实现是怎么样的? 其实map是一种HashMap,表面上看它只有键值对结构,实际上在存储键值对的过程中涉及到了数组和链表。HashMap之所以高效,是因为其结合了顺序存储(数组)和链式存储(链表)两种存储结构。数组是HashMap的主干,在数组下有有一个类型为链表的元素。 这是一个简单的HashMap的结构图: HashMap结构 当我们存储一个键值对时,HashMap会首先通过一个哈希函数将key转换为数组下标,真正的key-value是存储在该数组对应的链表里。 HashMap的数组往往是有限的,那当要存储的键值对很多数组不够或者两个键值对哈希运算后的值相同时,不就会有不同的键值对存储在同一个数组下吗?是的,...阅读全文

博文 2018-07-11 02:34:42 chaors

Go 语言的数据结构 :栈与队列

在[先前的博文](https://studygolang.com/articles/12686)中,我们探讨了链表以及如何将它应用于实际应用。在这篇文章中,我们将继续探讨两个相似且功能强大的数据结构。 ## 建模操作和历史 让我们看看 Excel 或 Google 文档,他们是人类发明的最普遍的构成文件的应用程序。我们都使用过它们。 正如你可能知道的,这些应用程序有各种各样对文本的操作。 比如在文本中添加颜色、下划线、各种字体和大小,或者在表格中组织内容。这个列表很长,我们期望从这些工具中得到一个普遍的功能 —— “撤销”和“重做”已经执行了的操作的能力。 你是否考虑过让你做,你将如何规划这样的功能?下面让我们探索一个可以帮助我们完成这样一项任务的数据结构。 ![](https://raw....阅读全文

博文 2018-05-10 21:46:45 SergeyChang

HTTP(S) 路由器fabio

fabio 是一个快速、现代、zero-conf 负载均衡 HTTP(S) 路由器,用于部署 consul 管理的微服务。 fabio 由 eBay Classifieds Group 开发, 用于处理 marktplaats.nl 和 kijiji.it 的流量。Marktplaats 所有的流量都经过 fabio ,每秒有数千个请求,分发于数个 fabio 实例。但我们并没有观察到任何延迟。 特性: * Go 语言单一二进制,没有额外的依赖。 * Zero-conf * 通过后台观察器热重载路由表 * 轮转和随机分布 * Traffic Shaping (send 5% of traffic to new instances) Graphite metrics * 请求跟踪 * W...阅读全文

Go程序GC优化经验分享

作者:达达来源:http://1234n.com/?post/yzsrwa最近一段时间对《仙侠道》的服务端进行了一系列针对GC的调优,这里跟各位分享一下调优的经验。游戏第一次上线的时候,大部分精力都投入在做cpuprof和memprof找性能瓶颈和内存泄漏上,没有关注过Go的GC运行情况。有一次cpuprof里的scanblock调用所占的比例让我注意到Go的GC所带来的性能消耗,记得那份cpuprof里,scanblock调用占到49%。也就是说有一半的CPU时间浪费在了GC上。于是我开始研究如何进行优化,过程中免不了要分析数据,经过一番搜索,我好到了GOGCTRACE这个环境变量。用法类似这样:GOGCTRACE=1 ./my_go_program 2> log_file 通过这个环境变...阅读全文

博文 2014-10-10 11:00:00 heiyeshuwu

内部排序算法(Golang版本)

package main import ( "fmt" ) func main() { //保存需要排序的Slice arr := []int{9, 3, 4, 7, 2, 1, 0, 11, 12, 11, 13, 4, 7, 2, 1, 0, 11, 12, 11} //实际用于排序的Slice list := make([]int, len(arr)) copy(list, arr) BubbleSortX(list) fmt.Println("冒泡排序:\t", list) copy(list, arr) QuickSort(list, 0, len(arr)-1) fmt.Println("快速排序:\t", list) copy(list, arr) //将arr的数据覆盖到li...阅读全文

博文 2015-11-23 03:00:00 achst

时间轮的 golang 实现 https://github.com/wgliang/timewheel

时间轮是一个固定大小的数组结构,这个数组的每一个槽(元素)代表着软定时器的精度,(类似于时钟的最小刻度).时间轮的优点:通过排序的时间列表来有效的更新 timers.它能非常效率地增加,取消 timer. 定时器的替代者,基于链表,自定义回调函数 应用于网络连接的过期失效,会话失效以及业务资源的自动释放和销毁失效等等 https://github.com/wgliang/timewhee...阅读全文

Go语言链接器大修

之前有帖子说到 [《Google抛弃C语言,采用Go语言重写Go编译器》](http://studygolang.com/topics/471),这里说到的是链接器。同样,有部分功能会使用 Go 语言编写。 ### 摘要 ### 在构建和运行一个标准的 Go 程序时,链接器是最慢的一部分。为了解决这个问题,我们计划将链接器拆分到两部分。其中的一部分可能会用 Go 来编写。 ### 背景 ### 链接器总是 Plan 9 工具链中最慢的部分之一,而现在它是 Go 工具链中最慢的部分了。Ken Thompson 在关于工具链的概述中进行了总结: 新的编译器编译迅速、加载缓慢,生成中等质量的目标代码。编译器与移植性相关,对于不同的计算机需要若干星期的工作来构建对应的...阅读全文

golang 表达式

表达式 1. 关键字 2. 运算符 3. 初始化关键字 关键字是指被编程语言保留而不让编程人员作为标志符使用的字符序列。因此,关键字也称为保留字, 每种编程语言都有自己的关键字,从使用的角度看,我们可以把Go语言的25个关键字分为如下三类:1. 用于程序声明 2. 用于程序实体声明和定义 3. 用于程序流程控制的关键字类别关键字程序声明import, package实体声明和定义var,const,type,struct,func,interface,map,chan流程控制if,else,switch,case,fallthrough,default,for,range,continue,break,go,select,defer,goto,return运算符 运算符就是用于执行特定计算或...阅读全文

go语言内存分配之TCMalloc

tcmalloc tcmalloc 优点 速度更快,比glicbc 2.3 快 占用更少的内存空间,8倍8-byte的对象内存分配中占用大约8N*1.01byte的头空间,而ptmalloc则会占用16N*byte的头空间 使用 在程序中只需使用“-ltmalloc”连接标识将其链接到程序中 综述 TCMalloc为每一个线程分配本地缓存,以满足小对象分配的需求,当需要时候,对象从中央数据结构移动到本地缓存,周期性的垃圾回收则将内存从各个线程的本地缓存收回中央数据结构。 小对象分配 每个小对象映射到170个不同的大小空间。每个空间间隔8byte,0-8byte(8),8-24byte(16),24-48byte(24),最大间隔为256byte。大对象和小对象的界限为32kb。每个线程的缓存...阅读全文

博文 2016-04-16 19:00:02 tanghui_lin

Go container包

Go container包 container/list-双向链表-List 基本的数据结构 type Element struct { // Next and previous pointers in the doubly-linked list of elements. // To simplify the implementation, internally a list l is implemented // as a ring, such that &l.root is both the next element of the last // list element (l.Back()) and the previous element of the first list // ...阅读全文

博文 2017-03-05 11:01:04 xxggy

《Go源码解读篇》之常见数据结构(list)

本打算用Go实现Java中常见的集合,简单实现ArrayList后,之后翻官网的package,发现了container/list,发现其实现十分的简洁,所以学习记录如下: List实现准备工作 如果想实现一个list,首先想到解决问题: 数据类型怎么处理? Go中有没有像Java中Object似的,万能的数据类型呢? 多亏Go中存在interface{}这样万能的数据类型,问题就迎刃而解啦! 来看看我的ArrayList实现设计: type ArrayList struct { size int32 data []interface{} } 我利用slice来实现简单的list(单向链表)操作,再看看官网的实现: type Element struct { prev, next *Elem...阅读全文

博文 2017-09-01 13:23:31 x_zhaohu

编译更小的 Golang 程序

go build -ldflags "-s -w" x.go (go install类似) -s 去掉符号表,然后 panic 的时候 stack trace 就没有任何文件名/行号信息了,这个等价于普通C/C++程序被strip的效果。不推荐使用。 -w 去掉 DWARF 调试信息,得到的程序就不能用 gdb 调试了,如果不打算用 gdb 调试,基本没啥损失。 示例: # go build main.go && ls -l main -rwxr-xr-x 1 Bing.L Bing.L 15054336 Nov 4 08:39 main # go build -ldflags "-s -w" main.go && ls -l main -rwxr-xr-x 1 Bing.L Bing.L ...阅读全文

博文 2014-11-05 03:00:01 bing-l

六、golang中的结构体和方法、接口

结构体: 1、用来自定义复杂数据结构 2、struct里面可以包含多个字段(属性) 3、struct类型可以定义方法,注意和函数的区分 4、strucr类型是值类型 5、struct类型可以嵌套 6、go语言中没有class类型,只有struct类型 struct声明: type 标识符 struct{ field1 type field2 type } 例子: type Student struct{ Name string Age int Score int } struct中字段访问,和其他语言一样,使用点 例子: var stu Student //拿结构题定义一个变量 stu.Name=”tony” stu.Age=18 stu.Score=20 fmt.Printf(“name=...阅读全文

博文 2017-12-24 16:30:01 pyrene

解剖Go语言map底层实现

``map``是Go语言中基础的数据结构,在日常的使用中经常被用到。但是它底层是如何实现的呢? # ``map``的整体结构图 Golang中``map``的底层实现是一个散列表,因此实现``map``的过程实际上就是实现散表的过程。在这个散列表中,主要出现的结构体有两个,一个叫``hmap``(``a header for a go map``),一个叫``bucket``。这两种结构的样子分别如下所示: hmap: ![hmap.png](https://static.studygolang.com/180826/09d0c94fc2946bba795ecc2ae0c97ac2.png) 图中有很多字段,但是便于理解``map``的架构,你只需要关心的只有一个,就是标红的字段:bucke...阅读全文

博文 2018-09-01 02:46:44 RyuGou

Go:操作注册表

package main import ( "fmt" "log" "golang.org/x/sys/windows/registry" ) func main() { key, exists, err := registry.CreateKey(registry.CURRENT_USER, "SOFTWARE\\Hello Go", registry.ALL_ACCESS) if err != nil { log.Fatal(err) } defer key.Close() if exists { fmt.Println("键已存在") } else { fmt.Println("新建注册表键") } // 写入32位整形值 key.SetDWordValue("DWORD", 0xFF...阅读全文

博文 2016-09-21 01:00:00 aqtata

Go:操作注册表

package main import ( "fmt" "log" "golang.org/x/sys/windows/registry" ) func main() { key, exists, err := registry.CreateKey(registry.CURRENT_USER, "SOFTWARE\\Hello Go", registry.ALL_ACCESS) if err != nil { log.Fatal(err) } defer key.Close() if exists { fmt.Println("键已存在") } else { fmt.Println("新建注册表键") } // 写入32位整形值 key.SetDWordValue("DWORD", 0xFF...阅读全文

博文 2016-08-23 13:00:03 aqtata

golang 实现斐波那契堆

二叉堆提供了o(lgn) 时间的插入, 删除最小,降级等操作,o(n) 时间的合并操作; 斐波那契堆提供了更优操作时间界限:o(1) 插入, o(lgn) 删除最小, o(lgn) 删除, o(1)合并。 根据算法导论上说,斐波那契堆在删除最小或删除操作被执行次数相比其他操作少得多时,尤为适用。一些图的算法中(计算最小生成树,单源最短路径)作为基本构建块(作为优先队用)。 考虑到斐波那契堆实现的复杂,可能二叉堆在实践上更具可用性。就像rob pike 在 里说: 3. 花哨的算法在 n 很小时通常很慢,而 n 通常很小。花哨算法的常数复杂度很大。除非你确定 n 总是很大,否则不要用花哨算法。 4. 花哨的算法比简单算法更容易出bug,更难...阅读全文

博文 2015-03-18 17:00:01 yujian0231

如何用Go实现单链表

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

博文 2017-11-09 06:41:27 rhan-zz

Go Hashmap内存布局和实现

想了解Go内置类型的内存布局的契机,是一次在调试“不同类型的小对象频繁创建对gc性能的影响”时发现map的gc性能不佳,而作为对比的包含slice的struct却很好。这里总结Go runtime里map的实现,可以解释这个问题。 hash table内部结构Go的map就是hashmap,源码在src/runtime/hashmap.go。对比C++用红黑树实现的map,Go的map是unordered map,即无法对key值排序遍历。跟传统的hashmap的实现方法一样,它通过一个buckets数组实现,所有元素被hash到数组的bucket中,buckets就是指向了这个内存连续分配的数组。B字段说明hash表大小是2的指数,即2^B。每次扩容会增加到上次大小的两倍,即2^(B+1)...阅读全文

博文 2017-12-18 13:58:29 nino's blog

Go数据结构之栈

一、什么是栈​这是杭州地铁1号线线路图。大卫哥考考大家,地铁列车如何调头?我也不卖关子了,列车通常是用“人字轨道”来变换车道。​列车先从A轨道开进“人字轨道”里,再从B轨道开出。从A轨道开进去的时候1号车厢是车头,从B开出来的时候4号车厢就变成车头了。所以大家看到地铁前后各一个车头。“人字轨道”有个特点:先进后出,英文简写就是FILO,含义自己体会。计算机专家把“人字轨道”抽象出来,提出了一个叫“栈”的概念。​栈和“人字轨道”的特点是一样的FIFO,只不过把车厢换成了数据。接下来,看大卫哥把栈扒的底裤不剩。二、栈的结构​大卫哥把栈拆分成容器和链表两块,容器用结构体实现,链表用单链表,当然大家也可以用其他链表结构,甚至数组来实现。三、接口说明及实现​1、Init初始化栈,其实就是初始化里面的链...阅读全文

博文 2017-11-16 02:29:29 rhan-zz

golang如何让编译生产的二进制文件变小

把Go程序变小的办法是: go build -ldflags "-s -w" (go install类似) -s去掉符号表(然后panic时候的stack trace就没有任何文件名/行号信息了, 这个等价于普通C/C++程序被strip的效果), -w去掉DWARF调试信息,得到的程序就不能用gdb调试了。 比如,server.go是一个简单的http server,用了net/http包。 $ go build server.go $ ls -l server -rwxr-xr-x 1 minux staff 4507004 2012-10-25 14:16 server $ go build -ldflags "-s -w" server.go $ ls -l server -rwxr...阅读全文

博文 2014-10-04 19:27:40 壬癸甲乙

Redis的数据类型及具体应用

Redis是一个key-value存储系统,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)等等。下面小编就和大家详细聊聊Redis的数据类型及其操作。 String 这是最简单的数据类型,一个Key对应一个Value,string类型是二进制安全的。Redis的string可以包含任何数据,如图片或序列化的对象。 String的操作: Set:设置key对应的值为string类型的value,如 set name Fahy Setnx:设置key对应的值为string类型的value,如果key已经存在,返...阅读全文

shuffle 洗牌算法

1.Fisher–Yates Shuffle(费雪耶兹 随机置乱算法)   算法思想就是从原始数组中随机抽取一个新的数字到新数组中。算法英文描述如下: Write down the numbers from 1 through N. Pick a random number k between one and the number of unstruck numbers remaining (inclusive). Counting from the low end, strike out the kth number not yet struck out, and write it down elsewhere. Repeat from step 2 until all the numbe...阅读全文

博文 2018-08-08 21:34:47 one_zheng

golang 调用 cgo coredump 获得方法

写一个错误的c程序 package dlsym import "testing" func Test_intercept(t *testing.T) { Intercept("gethostbyname\x00") } package dlsym // #cgo CFLAGS: -I. // #include // #include "dlsym_wrapper.h" import "C" import "unsafe" func Intercept(symbol string) { ptr := unsafe.Pointer(&([]byte(symbol)[0])) C.intercept((*C.char)(ptr), C.size_t(len(symbol)))...阅读全文

博文 2017-02-10 10:29:10 taowen

golang开发的ID生成器 go-id-builder

这是一个使用golang开发的ID生成器,它可以提供通过高效的方式产生连续唯一的ID值。在分库分表时可以提供非常有用的帮助。 **为什么要做id生成器** ** ** **如何实现的** go-id-builder使用mysql来做为最大id数的持久化存储。程序在每次启动的时候都会加载数据表中当前的所记录的id类型,将会自动申请1000个(配置文件中可修改)新的id号,加载到一个缓冲通道中,当用户向生成器的api接口发起请求时,从对应的缓冲通道中将数据取出返回给客户端...阅读全文

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

我希望的Golang的feature

如果有下面的功能,Go可以让程序员更高效。 1. 数学类型的自动转换。现在做个整数跟浮点数的计算也要手动转类型。据说是为了更安全和可预测的代码。但是其他主流语言都支持自动转,大家早就习惯了。需要考虑类型安全的地方,该考虑的人自然会去考虑。 2. Polymorphism的支持。interface对多态的支持还是比较有限。down casting做不了有的时候还是不大方便。比如下面这段代码就编不过 type Base struct { xxxx } type Derived struct { Base } func main() { v1 := &Drived{} var v2 *Base v2 = v1 //编译不过 v2 = *Base(v1) //也不行 } 3. 更方便的数组的操作比如...阅读全文

博文 2015-12-28 00:00:00 kefeng_chen

Golang 处理命令行启动参数

最近要做Apache Thrift相关的项目。大概看了一下,觉得不难。Thrift目前已经至此和Go语言了。照着官方提供的一个例子在学。周五搞了一上午,终于编译通过了。下午去读例子源码,发现一个从来没见过的包——flag。 不管是C开发还是Java,都接触过命令行开发。像大Java的main函数public static void main(String []args)直接参数里面就能读取到命令行启动参数。而Go语言的主函数是func main()果断啥也没,需要用这个包。 虽然Go不像大Java,在主函数里面直接就能获取到命令行参数,但是Go通过flag包获取到的参数类型,不像Java那样,只能是String类型。 再获取之前,需要自定义要获取的参数名称、参数默认值、参数使用方法,还有参数...阅读全文

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

高性能跨平台导表工具tabtoy

# tabtoy 游戏客户端,服务器的策划表格数据导出 # 优点 * 编写电子表格, 导出. 只需2步, 即可导出数据! * 跨平台运行, 无第三方依赖, 无需任何的vbs,vba,dll * 支持文件格式最多的导出器(json, lua, C#+二进制, protobuf text, proto, golang) * 一次设置, 自动生成索引代码, 支持lua, C# * 单元格字段列顺序随意调整, 自动检查错误, 精确报错位置 * 强类型, 导出时自动类型检查, 提前暴露表格错误 * 支持中文枚举值, 中文结构体字段, 编写,更直观 * 全中文导出提示,并支持多语言导出提示 * 支持导出Tag匹配,导出需要的部分, 避免...阅读全文

开源项目 2017-07-31 08:37:48 Davy xu

Go语言的素数筛

package main import ( "fmt" "runtime" "runtime/debug" ) // 返回生成自然数序列的管道: 2, 3, 4, ... func GenerateNatural() chan int { ch := make(chan int) go func() { for i := 2; ; i++ { ch <- i } }() return ch } // 管道过滤器: 删除能被素数整除的数 func PrimeFilter(in <-chan int, prime int) chan int { out := make(chan int) go func() { for { if i := <-in; i%prime != 0 { out <- ...阅读全文

博文 2014-10-10 07:00:02 chai2010

GO语言 使用hash 表

package main import ( "fmt" ) type Data struct{ date string; value int; } func main() { fmt.Printf("hello world!\n"); var m = make(map[string]int); //创建一个空白的hash m["str1"] = 10; m["str2"] = 1000; fmt.Printf("%d\n",m["str1"]); // 遍历 hash for name,value := range m { fmt.Printf("%s\t%d\n",name,value); } ...阅读全文

博文 2015-06-17 23:07:37 juxuny

如何压缩Golang 编译出的可执行文件大小

如何压缩Golang 编译出的可执行文件大小 2015-05-05 先给结论:可以减少到原来的29% 最近在写一个TLScat小工具 Github.com/mengzhuo/tlscat 源文件仅仅2KB不到,但是用 go build tlscat.go 编译出来的有4.6MB! 后来发现这个Golang的1.5才会解决的问题 Issue #6853 all: binaries too big and growing 可是,我就不信这个邪,于是搜索到了go build的一些用法 go build -ldflags "-s -w" ‘-s’ 相当于strip掉符号表, 但是以后就没办法在gdb里查看行号和文件了。 ‘-w’ flag to the linker to omit the debu...阅读全文

history.back()和history.go()的区别

Javascript:history.go()和history.back()的用法和区别 go(-1): 返回上一页,原页面表单中的内容会丢失;history.go(-1):后退+刷新;history.go(1) :前进 back(): 返回上一页,原页表表单中的内容会保留; history.back():后退 ; history.back(0) 刷新; history.back(1):前进 不同的浏览器的后退行为也是有区别的,而区别就跟Javascript:history.go()和history.back()的区别类似。 chrome和ff浏览器后退页面,会刷新后退的页面,若有数据请求也会提交数据申请。类似于 history.go(-1) 而safari(包括桌面版和ipad版本)的后退...阅读全文

博文 2016-09-11 17:00:01 yuan1013922969

单向链表 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

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

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