Go 进阶 · 分布式爬虫实战
郑建勋
Go 语言技术专家,《Go 语言底层原理剖析》作者
15839 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
Go 进阶 · 分布式爬虫实战
15
15
1.0x
00:00/00:00
登录|注册

29|细节决定成败:切片与哈希表的陷阱与原理

你好,我是郑建勋。
这节课,让我们来看一看切片与哈希表的原理。
我想先考你两道面试题。下面的代码中,foo 与 bar 最后的值是什么?
foo := []int{0,0,0,42,100}
bar := foo[1:4]
bar[1] = 99
fmt.Println("foo:", foo)
fmt.Println("bar:", bar)
下面的程序又会输出什么呢?
x := []int{1, 2, 3, 4}
y := x[:2]
fmt.Println(cap(x), cap(y))
y = append(y, 30)
fmt.Println("x:", x)
fmt.Println("y:", y)
其实之前我们在初始化 seeds 切片的时候,也有一些不合理之处。你发现了吗?
var seeds []*collect.Request
切片和哈希表是 Go 语言内置、并且使用广泛的结构。如果你对上面问题的答案都很模糊,很可能就是不太理解切片底层的原理。理清这些原理可以帮助我们更好地规避常见陷阱,写出高性能的代码。

切片的底层原理

我们先来看看切片的底层原理。
和 C 语言中的数组是一个指针不同,Go 中的切片是一个复合结构。一个切片在运行时由指针(data)、长度(len)和容量(cap)三部分构成。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Go语言中切片与哈希表的底层原理及性能优化技巧。首先,切片作为重要数据结构,其底层结构由指针、长度和容量构成,作者详细介绍了切片的特性和动态扩容机制,并强调了合理分配切片容量的重要性。此外,文章还涉及哈希表的原理和解决哈希碰撞的策略。在哈希表的重建过程中,提出了在初始化时评估并指定放入Map的数据大小,以减少重建的性能消耗。另外,对哈希表的删除原理进行了深入探讨,强调了在进行查找时,遇到emptyRest可以直接退出,提高了查找效率。总结指出,在实践中应评估容器容纳的数据量大小,并在初始化时指定容量,以提高程序性能。此外,文章还提出了避免混合使用切片截取和append的用法,以及在使用哈希表时进行合理的程序设计和必要的race检查。整体而言,本文内容深入浅出,适合读者快速了解切片与哈希表的底层原理及性能优化技巧。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • Realm
    1. map是指针型变量,多个协程同时写同一个内存时,会出现data race; 2. 写操作加锁,或者使用sync.Map;
    2022-12-15归属地:浙江
    5
  • InfoQ_lu
    老师,这门专栏,能不能多介绍写爬虫框架的技巧使用呢?感觉全是你的那本书里内容,关于Go语言的底层原理的改编,设计到爬虫内容更多。怎么说呢?这种理论确实是必要的,但对于不用用户群体,就应该和专栏名对应呀,感觉和爬虫相关性太少,更像分布式开发理论基础。
    2023-08-31归属地:北京
  • 林龍
    拉链法: 用链路的数据结构, 开放寻址法 :用数组的数据结构 链路(空间换时间) 优势: 对应新增跟删除数据时,无需挪动后面的元素 劣势 : 空间稍大,需要存放上下元素的指针 数组*(时间换空间) 优势: 空间较小,无需存放上下元素的指正 劣势: 增加或删除需要挪动后面的元素的数据
    2023-03-27归属地:广东
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部