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

golang中container/list包用法

list是一个双向链表。该结构具有链表的所有功能。 type Element type Element struct { Value interface{} //在元素中存储的值 } func (e *Element) Next() *Element //返回该元素的下一个元素,如果没有下一个元素则返回nil func (e *Element) Prev() *Element//返回该元素的前一个元素,如果没有前一个元素则返回nil。 type List func New() *List //返回一个初始化的list func (l *List) Back() *Element //获取list l的最后一个元素 func (l *List) Front() *Element //获取lis...阅读全文

博文 2015-01-16 19:25 chenbaoke

golang list slice 删除其中一项比对

slice可以动态添加项(使用append()函数),但是没有删除项的函数。变通方法,可以使用slice重新组合的方式删除一个或多个项,slice是引用类型,存的是指针,性能上不会有太多影响,示例如下:package mainimport "fmt"func main() { s := []int{11, 22, 33, 44, 55, 66} // 原始slice i := 2 // 待删除项索引 s = append(s[:i], s[i+1:]...) // 最后面的“...”不能省略 fmt.Println(s) // 数据结果 [11 22 44 55 66]} 有人回答的很好: 这样是可以实现。不过从slice这种数据结构来看,本身并不适合做删除操作。抛开语言,只谈数据结构,我们...阅读全文

博文 2015-06-10 18:52 panda1986_meng

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-29 00:18 LvanNeo

golang技术随笔(一)深入理解interface

Go语言的主要设计者之一罗布·派克( Rob Pike)曾经说过,如果只能选择一个Go语言的特 性移植到其他语言中,他会选择接口。可见接口在golang中的地位,及其对gloang这门语言所带来的活力。 golang中的interface是什么 接口相当于是一份契约,它规定了一个对象所能提供的一组操作。要理解golang中接口的概念我们最好还是先来看看别的现代语言是如何实现接口的。 C++没有提供interface这样的关键字,它通过纯虚基类实现接口,而java则通过interface关键字声明接口。它们有个共同特征就是一个类要实现该接口必须进行显示的声明,如下是java方式: interface IFoo { void Bar(); } class Foo implements IFoo ...阅读全文

博文 2015-01-26 19:13 justaipanda

Go 语言运算符

Go 语言运算符运算符用于在程序运行时执行数学或逻辑运算。Go 语言内置的运算符有:算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符接下来让我们来详细看看各个运算符的介绍。算术运算符下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。运算符描述实例+相加A + B 输出结果 30-相减A - B 输出结果 -10*相乘A * B 输出结果 200/相除B / A 输出结果 2%求余B % A 输出结果 0++自增A++ 输出结果 11--自减A-- 输出结果 9以下实例演示了各个算术运算符的用法:package main import "fmt" func main() { var a int = 21 var b int = 10 var c int c =...阅读全文

博文 2015-11-22 11:37 u011225629

http.ServeMux解析

## web server概述 使用go语言搭建一个web服务器是很简单的,几行代码就可以搭建一个稳定的高并发的web server。 ``` // hello world, the web server func HelloServer(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "hello, world!\n") } func main() { http.HandleFunc("/hello/", HelloServer) err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal("ListenAndServe: ", err) }...阅读全文

博文 2015-09-14 23:57:31 shanks

Go语言内存分配器的实现

前几天断断续续的写了3篇关于Go语言内存分配器的文章,分别是Go语言内存分配器设计、Go语言内存分配器-FixAlloc、Go语言内存分配器-MSpan,这3篇主要是本文的前戏,其实所有的内容本可以在一篇里写完的,但内容实在太多了,没精力一口气搞定。本文将把整个内存分配器的架构以及核心组件给详细的介绍一下,当然亲自对照着翻看一下代码才是王道。 内存布局结构图 我把整个核心代码的逻辑给抽象绘制出了这个内存布局图,它基本展示了Go语言内存分配器的整体结构以及部分细节(这结构图应该同样适用于tcmalloc)。从此结构图来看,内存分配器还是有一点小复杂的,但根据具体的逻辑层次可以拆成三个大模块——cache,central,heap,然后一个一个的模块分析下去,逻辑就显得特别清晰明了了。位于结构图...阅读全文

golang源码解读之map

golang的map实现并不是像c++一样使用红黑树,而是使用了hashmap,用数组来实现。 详细的实现后续补充,这里先做个备忘。 在iterate整个map的时候,使用delete是安全的。这跟c++是不一样的,c++在delete的时候,会导致整棵树发生变化,所以不能在迭代的时候删除元素。 那为什么golang的map是安全的呢,从源码来看,golang的map使用了桶的概念,元素是被hash到桶存储,每个桶预设是存储八个kv,而且在头部有一个uint8 tophash[8]的结构,存储每个key的高八位(即hash(key) » (64 - 8)),如果该位置未被放置元素,则有一个特殊的标志Empty。在插入删除的时候,首先会比较该uint8跟hash(key)是否相等。当然,桶还利...阅读全文

博文 2014-09-16 16:42 weijiaen

golang 标准库 container/ring 及 container/heap

由于目前golang 没有提供泛型机制,所以通用容器实现基本和 c 类似,golang 用 interface{} 做转接, c 用 void * 转接。 ring 包实现循环双向链表: type Ring struct { next, prev *Ring Value interface{} } 内部导出一个用户可以操作的Value 字段。 heap 包实现 binary heap : type Interface interface { sort.Interface Push(x interface{}) // add x as element Len() Pop() interface{} // remove and return element Len() - 1. } heap.I...阅读全文

博文 2015-03-18 13:57 yujian0231

Go Runtime hashmap实现

前两天有小伙伴问道是否看过 Go 语言 map 的实现,当时还真没看过,于是就花了一点时间看了一遍 runtime 源码中的 hashmap 实现。map 的底层实现就是一个 hash 表,大体结构上和平时在脑海里的 hash 表差不多,但确实有很多细节(“Devils in the details”)。 hashmap 通过一个 bucket 数组实现,所有元素将被 hash 到数组中的 bucket 中,bucket 填满后,将通过一个 overflow 指针来扩展一个 bucket 出来形成链表,也就是解决冲突问题。这也就是一个基本的 hash 表结构,没什么新奇的东西,下面总结一些细节吧。 注意一个 bucket 并不是只能存储一个 key/value 对,而是可以存储8个 key/...阅读全文

golang sync.Pool试用说明及注意事项

Go tip 是 Go 语言的实验分支,包含了很多尚在讨论,但很有可能会加入 stable 分支的特性。“Go tip 在做什么”(原文地址:What's happening in Go tip)分析总结了 Go 语言尚在开发中的一些重要特性。 本文译自:What's happening in Go tip (2014-01-10) 现在是 2014 年了,刚刚经历了圣诞和新年前夜,Go 团队就已经开始为下一个发布版本而工作了。也因此,“Go tip 在做什么”系列也重开了。 作为这个系列的最新一篇,这篇文章将会有些小调整。最重要的调整是,不会再遵循每周一篇文章的发布周期。一周里可能有几篇文章,也可能一篇都没有。这个调整,一部分由于个人原因,一部分也因为这样可以更灵活的追踪 Go 的改变。这...阅读全文

Golang redigo hmset hset 问题

最近公司项目,换到了golang 下面来开发,遇到了redis存储链表的问题,困扰了我好几天,后面静下心来,好好读了一下源码,发现官方的例子,最终还是羊毛出在羊身上 c, err := dial() if err != nil { panic(err) } defer c.Close() var p1, p2 struct { Title string `redis:"title"` Author string `redis:"author"` Body string `redis:"body"` } p1.Title = "Example" p1.Author = "Gary" p1.Body = "Hello" if _, err := c.Do("HMSET", redis.Args{...阅读全文

博文 2015-05-12 09:45 jackluo

修改 liteide 的 godoc 文档样式

在某些桌面环境下,如果 QT 无法运行,则打开 go api 的文档,可能由于系统颜色的原因,无法看清楚文档,甚至看不到文字。浏览了一个 liteide 的目录,发现在 liteide/share/liteide/packages/go/godoc 上有个样式表:style.css。修改这个样式表,即可调整文档的样式。 body { margin: 0; font-family: Helvetica, Arial, sans-serif; background: #333; } 我添加了 body 的背景颜色为 #333,使其不受系统桌面配置的影响。 pre { background: #333; padding: 10px; -webkit-border-radius: 5px; -moz...阅读全文

Goroutine 调度模型猜想

前言 近日在学习go语言,go语言的一个重大特色就是支持协程(coroutine),即用户级线程。由运行在用户态程序实现“执行体”的调度和切换(本文将一个可并发执行的逻辑单元称为“执行体”),整个过程运行在一个或多个线程上,执行体切换过程不用“陷入”内核态,因此较为轻量。 这种方式也有一定的缺点,因为协程概念提出的很早,主流语言却没有提供支持,必有原因,这个我们以后讨论。 当然,为了更好的了解goroutine,我们就有必要谈谈goroutine调度模型的实现。不过,作者是java开发人员,对分析c及汇编源码之类的事情能力有限,虽然有很多参考资料及公开的源码,分析来分析去,我也是醉了。所以在看了一些goroutine scheduler资料后,本文从另一个角度切入,描述下一个简单的协程调度模...阅读全文

博文 2015-04-30 11:10 qiankunli

Go Mvc的一个示例

下载 Go Mvc的一个示例,项目后台用户管理部分,包括用户的添加,修改,删除,分页,查询等操作。分享出来供大家参考。 data.sql 是表结构的创建SQL,运行前先创建数据表。DBConfig.xml是数据库连接字符串的设置,只所以独立出来一个文件,主要是方便程序里对文件进行修,力求简单,在程序运行前先设置Mysql连接信息。访问地址为:http://localhost:6080/Admin/AdminUser/Index 下...阅读全文

博文 2014-05-21 17:11 王岩0001

Go语言(container介绍)

今天,Mayuyu来介绍Go语言中一个重要的东西,叫做container。具体源码可以参考Go语言的源代码,如下 路径:/usr/local/go/src/pkg/container Github上的路径为:https://github.com/astaxie/gopkg/tree/master/container container的结构如下 可以看出包含三部分:heap,list和ring。下面分别介绍 1. heap heap即为堆,是一种常用的数据结构,在源码里面,提供了接口,在实际使用时需要实现。 下面是一个关于heap使用的实例。 代码: package main import ( "fmt" "container/heap" ) //heap提供了接口,需要自己实现如下方法 t...阅读全文

博文 2015-02-28 17:11 ACHelloWorld

Go语言 使用CGo进行优化

载自达达的博客 前阵子我利用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((*reflec...阅读全文

博文 2014-04-20 21:05 abv123456789

Go语言移植Linux内核数据结构hlist

hlist(哈希链表)可以通过相应的Hash算法,迅速找到相关的链表Head及节点. 在有些应用场景,比Go标准库提供的list(一种常见的双向链表)更合适。 依照list.h中的源码,我实现了一个Go语言版本的hlist例子。 首先说下hlist的构成: 在hlist(哈希链表)中, 头结点使用struct hlist_head来表示,hlist_head仅一个first指针. 普通节点使用struct hlist_node来表示。 源码中有几个特别的地方: 1. 在struct hlist_node中有一个**pprev中的二级指针, pprev指向的是当前hlist_node变量中的前一个变量的next的地址, 如果是第一个元素的话,这个值指向的是first的地址, 如果是最后一个节点...阅读全文

博文 2015-02-12 12:01 xcltapestry

go实现排序的链表

链表的数据结构比较线性数组,优点是 可以方便的对任意的位置进行插入和删除。 这一特性使得它很适合于应用在排序等场景下,由于golang目前类库还不是很完善,在java中可以很简单的使用api提供的支持完成对list或者map的排序,在使用go时就没有那么幸运了,可能需要自己去实现。 下面的例子就是使用go package 中的LinkedList实现的排序的链表。 有几个功能特性: 1.支持固定的长度 2.可自定义排序的规则 3.组合LinkedList功能 package codeforfun import ( "container/list" ) type SortedLinkedList struct { *list.List Limit int compareFunc func (o...阅读全文

博文 2013-08-14 23:25 mahang

GO语言标准库概览

Go标准库包含了大量包,提供了丰富广泛的功能特性。这里提供了概览仅仅是有选择性的且非常简单。本文发表后,标准库的内容还可能继续增加,因此 建议大家最好是通过在线查阅库API或使用godoc(包含在Go发布包中)来获取最新信息以及全面了解每个包所具备的功能。 exp包(试验性的)是那些未来可能被加入标准库的包起步的地方,因此除非你想参加这些包的开发(通过测试、讨论、提交补丁),否则不应该使用其 下面的包。exp包通常只存在于从Google Go源码树上签出的源码包中,但一般不会包含在预构建好的包中。其他包可以放心使用,虽然在写下本文的这一刻,很多包依旧不够完整。 Archive(归档)和Compression(压缩)包 Go支持读写tarball和.zip文件。与此相关的包为archive/t...阅读全文

博文 2015-11-25 19:32 u011032846

GDB调试Go程序进阶

目的:使用gdb附加到一个正在运行的进程上,然后做一些调试,并安全退出。 1. 修改Ubuntu配置,允许gdb附加到进程上,如何修改如下: http://askubuntu.com/questions/41629/after-upgrade-gdb-wont-attach-to-process 2. 查看进程id #ps ax 或者 #ps au 3. 启动gdb 4. 使用file命令来指定进程所联系的程序源代码和符号表,例如: file /home/yourihua/workplace/rhino/bin/console 5. attach <进程ID> 6. 打断点,如下: b /home/yourihua/workplace/rhino/src/github.com/yourihu...阅读全文

博文 2013年1月11日 Rhino(犀牛)

页面无法加载CSS样式

写了一个简单的登录页面,可是为什么加载不了外部CSS样式呢?可有人知道原因? 程序代码: package main import ( "fmt" "html/template" "net/http" "strings" "log" _ "github.com/go-sql-driver/mysql" "database/sql" ) type WebMux struct{ } func (p *WebMux) ServeHTTP(w http.ResponseWriter,r *http.Request){ switch r.URL.Path{ case "/": sayHello...阅读全文

Go语言内存分配器-MSpan

MSpan和FixAlloc一样,都是内存分配器的基础工具组件,但和FixAlloc没太大的交集,各自发挥功效而已。span(MSpan简称span)是用来管理一组组page对象,先解释一下page,page就是一个4k大小的内存块而已。span就是将这一个个连续的page给管理起来,注意是连续的page,不是东一个西一个的乱摆设的page。为了直观形象的感受一下span,还是得画个图吧,图形是最好的交流语言。 MSpan结构定义在malloc.h头文件中,代码如下: struct MSpan { MSpan *next; // in a span linked list MSpan *prev; // in a span linked list PageID start; // start...阅读全文

Go语言学习八:切片(slice)和范围(range)

// Go 语言切片是对数组的抽象。切片的单词来源于可以对其他数组和切片进行片段截取 // Go 数组的长度不可改变,在特定场景中这样的集合就不太适用, // Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"), // 与数组相比切片的长度是不固定的,可以追加元素, // 在追加时可能使切片的容量增大。 package main import "fmt" func main() { // 切片的长度和容量 var numbers = make([]int, 3, 5) //用make创建切片 printSlice(numbers) // 空(nil)切片 // 切片在未初始化时默认是nil,长度是0,容量也是0 var numbers1 []int printSlice(numbe...阅读全文

博文 2016-03-31 10:05 shawncheer

Go语言内存分配器-FixAlloc

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

[Go语言]Windows下的注册表操作

我编写了一个包,可以操作注册表。 github.com/jthmath/winapi/reg 目前只能写入值,所以充其量算0.1版,或者说只是一个例子。以后我将逐步完善它。 package main import ( "fmt" "github.com/jthmath/winapi/reg" ) const SubKey string = "software\\123" func main() { var err error Key, _, err := reg.CreateKey( reg.HKEY_CURRENT_USER, // 项 SubKey, // 子项 0, // 保留,必须是零 "", // class,暂时不填 reg.REG_OPTION_NON_VOLATILE, //...阅读全文

博文 2014-12-04 16:14 jthmath

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 通过这个环境变...阅读全文

博文 2013-12-25 16:28 heiyeshuwu

像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...阅读全文

博文 2012-04-25 14:04 MikeZhang

深入理解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的语法和数组很像,只是没有固定长度而已。...阅读全文

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....阅读全文

博文 2013-06-06 15:36 rufidmx

Go语言实现跳表(SkipList)

跳表(skiplist)在redis/levelDB中属于核心数据结构,我简单粗暴的用Golang实现了下。 就我的简单理解来说,就一个普通的链表,在insert时,通过Random_level(),把一层变成很多层, 越上数据越小,跨度越大。 查找时从上往下找,如果在一层没找到,在下一层继续时,以此节点作为起始, 继续查找,是一种用空间换时间的方式。 测试代码: package main //SkipList //author:Xiong Chuan Liang //date:2014-1-28 import ( "github.com/xcltapestry/xclpkg/algorithm" ) func main() { slt := algorithm.NewSkipList() ...阅读全文

博文 2015-01-27 23:33 xcltapestry

内部排序算法(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-22 15:34 achst

Go语言标准库概览

Go语言标准库概览 九 08 bigwhite技术志 Assert, Blog, Blogger, C, Cpp, Go, Golang, Google, Interface, map, Opensource, Programmer, Reflect, Slice, 切片, 博客, 反射, 容器, 开源, 接口, 断言, 方法, 标准库, 程序员, 结构体, 编程,语言, 编译器 No Comments 本文翻译自Dr.Dobb's的"A Brief Tour of the Go Standard Library"一文。 在Go语言五周系列教程的最后一部分中,我们将带领大家一起来浏览一下Go语言丰富的标准库。 Go标准库包含了大量包,提供了丰富广泛的功能特性。这里提供了概览仅仅是有选择性的且...阅读全文

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...阅读全文

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已经存在,返...阅读全文

用Golang写一个搜索引擎

用Golang写一个搜索引擎 猜你喜欢 golang入门-- 一个2D的图形库学习 golang入门--一个简单的http client golang的第一个deadlock LiteJob,一个Golang的本地任务调度器 再次自我黑客马拉松--不用第三方库实现一个基于golang的web service 如何利用golang 反射值来定义一个变量 用Golang写一个搜索引擎 用Golang写一个搜索引擎(0x01) 用Golang写一个搜索引擎(0x02) 用Golang写一个搜索引擎(0x03) 前面已经说了倒排索引的基本原理了,原理非常简单,也很好理解,关键是如何设计第二个倒排表,倒排表的第二列也很好设计,第一列就是关键了,为了满足快速查找的性能,设计第一列的结构,我们需要满足以下...阅读全文

博文 2016-04-14 14:46 daisongwan

golang 实现斐波那契堆

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

博文 2015-03-18 16:59 yujian0231

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...阅读全文

使用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...阅读全文

go语言打印九九乘法表

package main import "fmt" func main() { /* local variable definition */ var top int = 10 /*两层循环打印*/ for i:=1; i /*格式输出,最后输出一个制表符以分隔一行中的算式 %2d用于将每一个结果以两位整数对齐*/ fmt.Printf("%d * %d = %2d\t", i , j, i*j) } println() } } go语言编写的乘法表,初学者,各位轻拍。 输出: 1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = ...阅读全文

编译更小的 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 ...阅读全文

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

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

Go语言链接器大修

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

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。每个线程的缓存...阅读全文

博文 2015-09-30 12:04 tanghui_lin

我希望的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-25 17:21 kefeng_chen

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

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

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 20:36 zdy0_2004