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

Golang数组和切片的示例

写个小demo来看看通过生成切片append扩容后发生了什么 package main import ( "fmt" ) var ( //实例化一个长度容量为5的slice //从slice切出一个slice2 slice = make([]int, 5) slice2 = slice[2:] ) func main() { printSlice() //修改slice2第0个元素 slice2[0] = 1 printSlice() //扩容slice2 slice2 = append(slice2, 2) printSlice() //修改slice2第0个元素 slice2[0] = 3 printSlice() //修改slice第0个元素 slice[0] = 4 printSli...阅读全文

博文 2019-05-25 22:34:44 CappuccinoBx

深入理解 Go map:赋值和扩容迁移

概要 在 上一章节 中,数据结构小节里讲解了大量基础字段,可能你会疑惑需要 #&(!……#(!¥! 来干嘛?接下来我们一起简单了解一下基础概念。再开始研讨今天文章的重点内容。我相信这样你能更好的读懂这篇文章 原文地址:深入理解 Go map:赋值和扩容迁移 哈希函数 哈希函数,又称散列算法、散列函数。主要作用是通过特定算法将数据根据一定规则组合重新生成得到一个散列值 而在哈希表中,其生成的散列值常用于寻找其键映射到哪一个桶上。而一个好的哈希函数,应当尽量少的出现哈希冲突,以此保证操作哈希表的时间复杂度(但是哈希冲突在目前来讲,是无法避免的。我们需要 “解决” 它) 链地址法 在哈希操作中,相当核心的一个处理动作就是 “哈希冲突” 的解决。而在 Go map 中采用的就是 "链地址法 " 去解...阅读全文

博文 2019-03-24 21:34:40 煎鱼

golang使用slice中遇到的坑

package main import ( "fmt" ) func sliceFunc(i []int, num int) []int { for j := 0; j < num; j++ { i = append(i, 3) } i[0] = num return i } func main() { s := make([]int, 0, 3) s = append(s, 1) fmt.Printf("cap=%d\ts=%v\n",cap(s),s) fmt.Println("=========") s1 := sliceFunc(s, 2) fmt.Printf("cap=%d\ts=%v\n",cap(s),s) fmt.Printf("cap=%d\ts1=%v\n",cap(s...阅读全文

博文 2016-08-30 16:00:00 52zjj

【golang】切片扩容原理,完成入栈操作

我们都知道,切片是对一段数组的引用,其内部有指向引用数组首地址指针,长度与容量三个部分组成。其长度相对于数组是可变的。 通过append可以给切片添加元素,如果切片长度超过容量时候,切片会进行自动扩容(扩容过程通过拷贝实现的),需要注意的当切片扩容时,其会新开一块内存来存储扩容后的切片,相比前后其内存地址已经改变,这在引用中是一个易错点 切片扩容机制:当原切片长度小于1024时,新切片的容量会直接翻倍。而当原切片的容量大于等于1024时,会反复地增加25%,直到新容量超过所需要的容量 下面演示一段,切片扩容原理 type queue []*Use func NewQp() queue { return make(queue, 0, 1) } func (pq *queue) push(u *...阅读全文

博文 2020-04-16 03:32:48 dongzaidong

Go语言的协程池 , 节省内存 , 减少GC压力

Factory Go语言的协程池 , 节省内存 , 减少GC压力 安装 go get github.com/letsfire/factory 用法 // 新建一个协程池,指定协程数量20000 var master = factory.NewMaster(20000) // 新建第一条工作流水线 var line1 = master.AddLine("demo.line.1", func(args interface{}) { // TODO 处理您的业务逻辑 // fmt.Println(args...) }) // 新建第二条工作流水线 var line2 = master.AddLine("demo.line.2", func(args interface{}) { // TODO 处...阅读全文

博文 2019-08-14 19:02:39 letsfire

Golang Map 实现 (四) map的赋值和扩容

golang map 操作,是map 实现中较复杂的逻辑。因为当赋值时,为了减少hash 冲突链的长度过长问题,会做map 的扩容以及数据的迁移。而map 的扩容以及数据的迁移也是关注的重点。 数据结构 首先,我们需要重新学习下map实现的数据结构: type hmap struct { count int flags uint8 B uint8 noverflow uint16 hash0 uint32 buckets unsafe.Pointer oldbuckets unsafe.Pointer nevacuate uintptr extra *mapextra } type mapextra struct { overflow *[]*bmap oldoverflow *[]*bma...阅读全文

博文 2020-04-30 10:32:41 搬砖程序员带你飞

Go语言的协程池 ,优化实现自动扩容

Go语言的协程池 , 节省内存 , 减少GC压力 项目地址:https://github.com/letsfire/factory.git 安装 go get github.com/letsfire/factory 用法 // 新建协程池,最大允许协程数20000和初始化数量8 // 协程工人繁忙不够用的情况下 , 内部实现自动扩容 // 扩容不会超过您指定的最大允许协程数量 var master = factory.NewMaster(20000, 8) // 新建第一条工作流水线 var line1 = master.AddLine("demo.line.1", func(args interface{}) { // TODO 处理您的业务逻辑 // fmt.Println(args.....阅读全文

博文 2019-08-26 18:02:38 letsfire

Golang Slice原理

结构 type slice struct { array unsafe.Pointer // 底层是个数组 len int // slice元素个数 cap int // 数组容量 } 扩容策略 当要扩成的大小newCap>2*currentCap,扩为newCap 当currentCap<1024时,扩为两倍 当currentCap>=1024时,currentCap * 1.25 * 1.25 * ... (直到>newCap) 扩容:memmove(newSlice, oldSilce, lenmem)做内存拷...阅读全文

博文 2019-04-17 23:34:40 一剑光寒十九洲

深入理解 Go map:赋值和扩容迁移

深入理解 Go map:赋值和扩容迁移 概要 在 上一章节 中,数据结构小节里讲解了大量基础字段,可能你会疑惑需要 #&(!……#(!¥! 来干嘛?接下来我们一起简单了解一下基础概念。再开始研讨今天文章的重点内容。我相信这样你能更好的读懂这篇文章 哈希函数 哈希函数,又称散列算法、散列函数。主要作用是通过特定算法将数据根据一定规则组合重新生成得到一个散列值 而在哈希表中,其生成的散列值常用于寻找其键映射到哪一个桶上。而一个好的哈希函数,应当尽量少的出现哈希冲突,以此保证操作哈希表的时间复杂度(但是哈希冲突在目前来讲,是无法避免的。我们需要 “解决” 它) 链地址法 在哈希操作中,相当核心的一个处理动作就是 “哈希冲突” 的解决。而在 Go map 中采用的就是 "链地址法 " 去解决哈希冲突...阅读全文

博文 2019-03-26 09:29:56 EDDYCJY