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

Go语言实现LRU算法

LRU 通常使用hash map + doubly linked list实现。在Golange中很简单,使用List保存数据,Map来做快速访问即可. 具体实现了下面几个函数: func NewLRUCache(cap int)(*LRUCache) func (lru *LRUCache)Set(k,v interface{})(error) func (lru *LRUCache)Get(k interface{})(v interface{},ret bool,err error) func (lru *LRUCache)Remove(k interface{})(bool) 演示: package main //LRU Cache //author:Xiong Chuan Lian...阅读全文

博文 2015-06-17 23:07:42 xcltapestry

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

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标准库包含了大量包,提供了丰富广泛的功能特性。这里提供了概览仅仅是有选择性的且...阅读全文

博文 2014-11-22 13:00:55 bigwhite

数据结构——Golang实现双向链表

载请注明出处:数据结构——Golang实现双向链表 Golang 1. 双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 结构如下图: image.png 2. Golang 实现 2.1. 相关结构体 首先需要先定义一下链表相关的结构,DoubleObject用于每个节点的数据,为interface{}结构,DoubleNode为链表中的节点,DoubleList双链表,为了多协程读写安全,所以在链表中加了读写锁。 具体定义如下: // 节点数据 type DoubleObject interface{} // 双链表节点 type DoubleNode ...阅读全文

博文 2019-01-30 23:34:42 ChainZhang

用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 17:00:04 daisongwan

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 做了关联,三级联动

代码如下:```package mainimport ( "database/sql" "encoding/json" "fmt" "io/ioutil" "log" "net/http" "strconv" "strings" _ "github.com/go-sql-driver/mysql")type tude struct { Lat float32 `json:lat` Lng float32 `json:lng`}type region struct { Id string `json:id` Name string `json:name,omitempty` Fullname string `json:fullname` Location tude `json:location...阅读全文

博文 2017-07-02 10:57:32 April

GO语言中container/list使用详解

go中container中list的使用详解 1. func New() *List{} 初始化一个列表,返回类型为一个list对象 a := list.New() # 在函数内部 a = list.New() 输出: &{{0xc00006a300 0xc00006a300 } 0} 2. func (l List) Back() Element{} 返回链表的最后一个元素,返回类型元列表中的元素。 x := a.Back() fmt.Println(strings.Repeat("-----------", 10)) fmt.Println(x) &{0xc00006a300 0xc00006a330 0xc00006a300 b} 3. func (l List)...阅读全文

博文 2019-05-16 14:35:23 qq5c9c828bc8d4b

Golang map 如何进行删除操作?

map 的删除操作 Golang 内置了哈希表,总体上是使用哈希链表实现的,如果出现哈希冲突,就把冲突的内容都放到一个链表里面。 Golang 还内置了delete函数,如果作用于哈希表,就是把 map 里面的 key 删除。 delete(intMap, 1) map 的删除原理 可以直接看源码。 我简单摘几行: func mapdelete(t *maptype, h *hmap, key unsafe.Pointer) { for ; b != nil; b = b.overflow(t) { for i := uintptr(0); i < bucketCnt; i++ { b.tophash[i] = empty h.count-- } } } 外层的循环就是在遍历整个 map,删...阅读全文

博文 2017-11-02 02:04:46 Cyeam

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语言内存分配器-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...阅读全文

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

页面无法加载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 语言的数据结构 :栈与队列

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

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

六、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

【GoLang那点事】深入Go的Map使用和实现原理

#### 开篇语 > Map是一种常用的kv数据结构,程序设计中经常使用,且作为一种最基础的数据结构,很多编程语言本身提供的api都会有实现,Go也不例外,今天我们将从一下三个方面为大家分析Go中的Map。 * 什么是Map? * Go中如何使用Map? * 以及Go的Map实现机制是什么样? > 希望通过这几个方面的讲解,让大家真正理解Go的Map使用和实现。 #### 什么是Map ##### key,value存储 > 最通俗的话说Map是一种通过key来获取value的一个数据结构,其底层存储方式为数组,在存储时key不能重复,当key重复时,value进行覆盖,我们通过key进行hash运算(可以简单理解为把key转化为一个整形数字)然后对数组的长度取余,得到key存储在数组的哪个...阅读全文

博文 2019-07-27 14:56:59 SunPengWei

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

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

如何压缩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...阅读全文

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

Goroutine 调度模型猜想

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

博文 2015-05-04 09:00:02 qiankunli

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

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运算符 运算符就是用于执行特定计算或...阅读全文

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

博文 2014-10-09 16:55:02 Rhino(犀牛)

用golang写一个简单的游戏

事情是这样子的,前阵子我想重新把算法学习一下,在看到动态规划的时候,莫名想到这些算法题目就跟游戏一样,每个游戏都有规则,要过关,就要在游戏规则下达到特定的目标。所以,我萌生了把算法题做成一个游戏的想法,不管什么算法都行,规则我可以自己定义。 那么,做个游戏,它总要有界面,自然我不会写gui,暂时也没有想用golang的gui库的想法。所以我的第一步是用终端先实现一个,在界面上能够显示出东西。这个要求对于golang来说一点都不高。 再来,是游戏规则的设定,这个游戏,我会分几个版本去完成它,多以第一个版本,我会设定得足够简单,规则如下:界面上会由n×m个点组成,通过键盘上的方向键控制点的移动,从起点到达终点即可完成看任务。如图: 界面.png 我们分析一下,完成这样一件事情,我们需要做的工作有...阅读全文

博文 2020-05-12 01:32:51 onepunchgo

golang对象内存分配

一、分配对象(源码) // 分配对象内存入口 func newobject(typ *_type) unsafe.Pointer { return mallocgc(typ.size, typ, true) } // 分配指定object的大小(bytes数) // 当分配的object大小 <= 32kb 使用每个P本地缓存空闲列表即可 // > 32 kB 直接堆上进行分配. func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer { // 零长度对象 if size == 0 { return unsafe.Pointer(&zerobase) // 在heap上分配,则都指向预设的同一全局变量(零长度...阅读全文

博文 2019-01-07 19:34:46 神奇的考拉

morose things go by

现在可以安静一下找个时间写下这个随感了。回家半个月确实挺好,但有时也感觉自己很无聊额~有点小感冒头疼了,希望早日康复。想想怎么写来调节一下顺应即将的大三生活,端正自己的态度,大三少胡思乱想一点,少走些弯路,好好弄自己的东西... 今天刚发了课程表,列一下要学的:数据恢复与数字取证、操作系统、计算机网络、软件工程、计算机网络实验、计算机组成原理、SQL server 、现代教育技术应用、教师职业道德与专业发展,应该还有其它的还没有排出来吧。挺好,大都是计算机方面的理论,虽说实践能力不强,但会有用的吧。之前在知乎上看到有个游戏设计师、程序员阿猫回答过,(我只是截取一部分打了下来)一旦你进入真正的开发岗位,就会发现每天会面对相当多这样的问题,而这些问题的解决有赖于坚实的计算机/数理基础,需要的是对...阅读全文

博文 2015-12-21 21:00:02 zuguodexiaoguoabc

GO语言标准库概览

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

博文 2015-12-03 23:00:03 u011032846

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

博文 2015-06-17 23:07:24 jthmath

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-10-27 10:00:01 abv123456789

微信公众号扫描带参数二维码实现自动分组

使用微号帮渠道二维码生成功能,粉丝通过扫描二维码统计来源,并自动分组。满足企业公众号市场分析,只有已微信认证的服务号才能实现,订阅号没有生成带参数的二维码的权限。1、微信扫码关注自动打标签分组创建渠道二维码》粉丝识别标识》打标签/分组,设置成功后,粉丝扫码关注就会自动打标签分组​​​2、微信扫码关注自动修改粉丝备注创建渠道二维码》粉丝识别标识》修改粉丝备注名,设置成功后,粉丝扫码关注就会自动修改粉丝备注名​​​3、粉丝扫码自动打标签分组数据明细​​​4、渠道粉丝数据统计渠道二维码统计数据表,粉丝微信扫码关注或取关公众号都能统计监测到​​...阅读全文

博文 2019-08-01 16:53:16 gujiushu

golang数据结构之List

golang数据结构之List,实际中用得很少,这里只做研究。 package main import ( "container/list" "github.com/sanity-io/litter" ) type Thing struct { Id int Info string } // golang 双向链表结构 func main() { doubleList := list.New() doubleList.PushBack(&Thing{Id:1, Info:"hello"}) doubleList.PushBack(&Thing{Id:2, Info:"list"}) doubleList.PushBack(&Thing{Id:3, Info:"!"}) //for e := ...阅读全文

博文 2018-08-10 12:30:02 LittleLee

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

博文 2019-05-13 12:35:18 qq5c9c828bc8d4b

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

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

从源码讲解 golang 内存分配

## 引言 golang 是谷歌2009年发布的开源编程语言,截止目前go的release版本已经到了1.12,Golang 语言专门针对多处理器系统应用程序的编程进行了优化,使用 Golang 编译的程序可以媲美 C /C++代码的速度,而且更加安全、支持并行进程。和其他“高级语言”一样,golang同样有一套自己的内存管理机制,自主的去完成内存分配、垃圾回收、内存管理等过程,从而避免频繁的向操作系统申请、释放内存,有效的提升go语言的处理性能。由于篇幅有限,本文重点针对golang1.12.6版本就内存分配情况进行一下梳理和讲解。golang的内存管理是基于tcmalloc模型设计,但又有些差异,局部缓存并不是分配给进程或者线程,而是分配给P(Processor);golang的GC是s...阅读全文

博文 2019-08-11 01:00:24 polaris

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

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

使用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语言运算符

算数运算符 下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。 运算符 描述 实例 + 相加 A + B 输出结果 30 - 相减 A - B 输出结果 -10 * 相乘 A * B 输出结果 200 / 相除 B / A 输出结果 2 % 求余 B % A 输出结果 0 ++ 自增 A++ 输出结果 11 -- 自减 A-- 输出结果 9 关系运算符 运算符 描述 实例 == 检查两个值是否相等,如果相等返回 True 否则返回 False。 (A == B) 为 False != 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 (A != B) 为 True > 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 (A ...阅读全文

博文 2019-04-30 02:35:11 类似简单

高性能跨平台导表工具tabtoy

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

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

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

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

循环链表的Go语言实现

一、什么是循环链表​循环链表的节点形成一个圈。把单链表的尾巴指向开头形成单循环链表。把双向链表的尾巴与开头链接起来就形成双向循环链表。使用循环链表可以不断的绕圈寻找所需要的数据,而不需要像单链表那样每次都从开头开始寻找,可以提高查询的效率。今天大卫哥先实现一个单向循环链表,双向循环链表的实现就交给大家了。二、单向循环链表的Go实现1、节点​单向循环链表的节点和单链表的实现是类似的,不过为了区别,我们取了不同名字。type CNode struct { data Object next *CNode }2、单向循环链表​单向循环链表车队由5节车厢组成,1号车是车头。为了表示这种关系,大卫哥用下面的结构体来承载。type CList struct { size uint64 // 车厢数量 he...阅读全文

博文 2017-11-10 03:15:53 rhan-zz

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语言移植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-23 16:00:01 xcltapestry

Go凭什么击败C++成为证券期货行情系统的首选语言

Golang 由于其高效快速、天然支持并发的显著优势,大大降低了服务的开发门槛,使得企业更易于直接架构业务,这些特性使得越来越多的传统公司技术部门选择拥抱 Go ,并结合自身业务特点摸索出了丰富的实践经验。在由 Go 中国和七牛云联合主办的 Gopher China2017中,来自金大师的技术经理张泽武详细分享了一个使用 Go 语言开发全套证券、期货、行情处理及分发系统。项目背景是在团队成员未完全到位的情况下,使用简单易用的 Go 语言后,用三个月的时间开发完成。并在随后的项目发展中,这套系统逐步演化完善成一套自有的快速开发框架。项目故事 项目启动的时候,领导对这个行情系统有几个要求,怎么在最短的时间交付,怎么满足大量并发的请求,怎么保证低延时,把交易所的行情数据尽可能快的发到客户端。在这些...阅读全文

博文 2017-08-09 01:41:29 张泽武

Go语言链接器大修

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

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

【BAT后台入门】第三课:链表,队列与栈

小伙伴们,今天更新第三课:链表,队列和栈。链表是计算机科学中很多数据结构的基础,非常重要;队列和栈的应用也非常广泛。文中不光介绍了链表、队列和栈的工作原理和基础实现,还结合工业界的实际应用,给出了优化的建议。比如使用内存池或者使用数组的方式,来减少内存分配的次数,随之Golang的GC开销也会减小。这些优化技巧,在构建高性能服务端开发的时候,至关重要。目前系列课程已更新至第三课,感谢朋友们与我一起坚持。有师弟在小密圈反馈说:第二课的干货很多,收获很大。我感觉很欣慰,努力没有白费。但是很遗憾的是,有不少学习了第一课的小伙伴,暂时没有坚持学第二课。程序员是一个很辛苦的职业,要不断的学习和提升,永远不要待在comfort zone。欢迎大家在文章下面留言打卡,或者加入西七楼小密圈,与豪华嘉宾阵容一...阅读全文

博文 2017-07-09 16:06:52 西七楼

【Go语言踩坑系列(十)】Channel(下)

声明 本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。 引入 有了上一篇文章的基础,这一节我们来看通道的底层实现,我们先看一个例子,相信你已经很熟悉了: func main() { ch := make(chan int) go func() { ch <- 1 }() time.Sleep(5 * time.Second) fmt.Println(len(ch)) // 0 <- ch } 我们在主协程中创建一个通道,并且开了一个子协程往通道里写入一个数据,然后再在主协程读取这个数据,且在读取之前打印通道的有效长度。由于我们在上一节说过,这是一个非缓冲通道,如果我们要向里面写入数据,必须得有接收方同时来接收才可以,否则就会发生死锁。 代码...阅读全文

博文 2020-04-12 18:32:42 NoSay