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

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

Go简单排序

写代码的时候发现需要对map[int64]int64排序,golang中sort包来解决这个问题,下面是从网上找的2个例子,备忘下。 例子一: package main import ( "fmt" "sort" ) func main() { m := map[string]string{"b": "15", "z": "123123", "x": "sdf", "a": "12"} mk := make([]string, len(m)) i := 0 for k, _ := range m { mk[i] = k i++ } sort.SortStrings(mk) fmt.Println(mk) } 例子二: // A data structure to hold a key/val...阅读全文

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

Golang的值类型receiver和指针类型receiver

Golang的值类型和指针类型receiver一直让我比较混淆,在此做几个试验备忘 先看指针类型的receiver: package main import ( "fmt" ) type BasicEvent struct { EventId int } func (ev *BasicEvent) updateEventID(id int) { ev.EventId = id } func main() { ev1 := &BasicEvent{EventId: 1} fmt.Printf("before update id = %d\n", ev1.EventId) ev1.updateEventID(2) fmt.Printf("After update id = %d\n", ev1....阅读全文

博文 2015-04-23 14:41 miros

ssdb的golang驱动的同步问题

如果数据库连接只有一个,在某个时间点(指的是某个及其短的时间内),多个读写的话,会出问题,修改了下,加了个mutex,算是解决了此问题,贴下备忘 var mutex sync.Mutex func (c *Client) Do(args ...interface{}) ([]string, error) { var resp []string var err error mutex.Lock() err = c.send(args) resp, err = c.recv() mutex.Unlock() return resp, err ...阅读全文

博文 2014-07-18 22:07 ziyouchutuwenwu

golang初探备忘

最近闲来没事,了解一下技术。听说golang很长时间了但是一直没怎么了解过,去年装了个go1.4然后下项目中忙了就扔那里没学习了,一年都过去了.... 最近看2016语言排行,go成了2016年度语言,目前排名13,是该学一学了! 关于golang的性能 这个是很重要的,如果golang的性能不高,估计不会有什么用最起码对于我来说,如果还不如java快为何还要用golang? 有什么优势呢? 所以从网上扒了扒资料,从google找到的里面包含的基准测试下一部分主流语言的性能对比:https://benchmarksgame.alioth.debian.org/u64q/go.html (备忘一下地址) (未完待续持续总结...阅读全文

博文 2017-01-23 12:00:10 sirgo_

golang的"..."备忘

1. 用于数组: 表示长度与元素个数相同. 在golang中数组的长度是类型的一部分,不同长度,不同类型. 2. 用于参数: 用于形参表示可变参数. 用于实参表示直接传递. 具体解释参数见官方文档: 传递可变参数时: (1) 如果实参后不跟..., 则在底层创建与形参类型相同的slice,然后将实参赋值后传递. (2) 如果实参后跟..., 则不在底层创建与形参类型相同的slice,而是直接将实参传递给形参. /ref/spec#Passing_arguments_to_..._parameters Passing arguments to ... parameters If f is variadic with a final parameter p of type ...T, then ...阅读全文

博文 2016-09-07 13:27 zolo