元数据

Go语言设计与实现

  •  Go语言设计与实现|200
  • 书名: Go语言设计与实现
  • 作者: 左书祺
  • 简介:
  • 出版时间
  • ISBN:
  • 分类:
  • 出版社:

高亮划线

详解 Go 语言中间代码生成

  • 📌 图 2-13 关键字和操作符和运行时函数的映射 ^CB-GIkBAoB8oFhu6W66U5-9-12973-12996
    • ⏱ 2022-01-13 19:19:27

Go 语言数组的实现原理

  • 📌 在不考虑逃逸分析的情况下,如果数组中元素的个数小于或者等于 4 个,那么所有的变量会直接在栈上初始化,如果数组元素大于 4 个,变量就会在静态存储区初始化然后拷贝到栈上 ^CB-GIkBAoB8oFhu6W66U5-11-11305-11389
    • ⏱ 2022-01-14 11:11:17

理解 Golang 哈希表 Map 的原理

  • 📌 B 表示当前哈希表持有的 buckets 数量,但是因为哈希表中桶的数量都 2 的倍数,所以该字段会存储对数,也就是 len(buckets) == 2^B; ^CB-GIkBAoB8oFhu6W66U5-13-16980-17098

    • ⏱ 2022-01-14 15:02:17
  • 📌 图 3-12 哈希表的数据结构 ^CB-GIkBAoB8oFhu6W66U5-13-17570-17585

    • ⏱ 2022-01-14 16:15:05
  • 📌 上述的 for 循环会依次遍历正常桶和溢出桶中存储的数据,整个过程会分别判断 tophash 是否相等、key 是否相等,遍历结束后会从循环中跳出。 ^CB-GIkBAoB8oFhu6W66U5-13-39194-39300

    • ⏱ 2022-01-17 14:28:27
  • 📌 如果这次扩容是溢出的桶太多导致的,那么这次扩容就是等量扩容 sameSizeGrow,sameSizeGrow 是一种特殊情况下发生的扩容,当我们持续向哈希中插入数据并将它们全部删除时,如果哈希表中的数据量没有超过阈值,就会不断积累溢出桶造成缓慢的内存泄漏。runtime: limit the number of map overflow buckets 引入了 sameSizeGrow 通过复用已有的哈希扩容机制解决该问题,一旦哈希中出现了过多的溢出桶,它会创建新桶保存数据,垃圾回收会清理老的溢出桶并释放内存。 ^CB-GIkBAoB8oFhu6W66U5-13-42931-43374

    • ⏱ 2022-01-17 15:33:08
  • 📌 哈希表 runtime.hmap 的桶是 runtime.bmap。每一个 runtime.bmap 都能存储 8 个键值对,当哈希表中存储的数据过多,单个桶已经装满时就会使用 extra.nextOverflow 中桶存储溢出的数据。 ^CB-GIkBAoB8oFhu6W66U5-13-17613-18008

    • ⏱ 2022-01-17 17:10:22

理解 Go 语言的函数调用

  • 📌 C 语言同时使用寄存器和栈传递参数,使用 eax 寄存器传递返回值;而 Go 语言使用栈传递参数和返回值。 ^CB-GIkBAoB8oFhu6W66U5-15-13136-13189

    • ⏱ 2022-01-17 16:19:18
  • 📌 Go 通过栈传递函数的参数和返回值,在调用函数之前会在栈上为返回值分配合适的内存空间,随后将入参从右到左按顺序压栈并拷贝参数,返回值会被存储到调用方预留好的栈空间上 ^CB-GIkBAoB8oFhu6W66U5-15-20791-20873

    • ⏱ 2022-01-17 16:27:56

Go 语言接口的原理

  • 📌 Go 语言只会在传递参数、返回参数以及变量赋值时才会对某个类型是否实现接口进行检查 ^CB-GIkBAoB8oFhu6W66U5-16-5965-6006

    • ⏱ 2022-01-17 16:40:45
  • 📌 当我们使用指针实现接口时,只有指针类型的变量才会实现该接口; ^CB-GIkBAoB8oFhu6W66U5-16-13185-13215

    • ⏱ 2022-01-17 17:00:41
  • 📌 将上述变量传入 NilOrNot 方法并与 nil 比较会返回 false; ^CB-GIkBAoB8oFhu6W66U5-16-14229-14328

    • ⏱ 2022-01-17 17:06:06
  • 📌 在类型转换时,*TestStruct 类型会转换成 interface{} 类型,转换后的变量不仅包含转换前的变量,还包含变量的类型信息 TestStruct,所以转换后的变量与 nil 不相等。 ^CB-GIkBAoB8oFhu6W66U5-16-14459-14621

    • ⏱ 2022-01-17 17:06:15
  • 📌 由于 interface{} 类型不包含任何方法,所以它的结构也相对来说比较简单,只包含指向底层数据和类型的两个指针。 ^CB-GIkBAoB8oFhu6W66U5-16-15273-15351

    • ⏱ 2022-01-17 17:17:38

读书笔记

本书评论