go底层系列-go专家编程笔记
文章平均质量分 87
这些博客是我在看《go专家编程》这本书时,做的笔记
我发现通过markdown格式调整后,更容易串联书中体系知识。
分享给大家
您是弟弟
这个作者很懒,什么都没留下…
展开
-
Go底层 - 反射与interface③
接口的构造过程是怎样的我们已经看过了 iface 和 eface 的源码知道 iface 最重要的是 itab 和 _type为了研究清楚接口是如何构造的接下来我会拿起汇编的武器还原背后的真相来看一个示例代码:package mainimport "fmt"type Person interface { growUp()}type Student struct { age int}func (p Student) growUp() { p.ag原创 2021-12-21 21:04:46 · 131 阅读 · 0 评论 -
Go底层 - 反射与interface②
深度解密Go语言之关于 interface 的 10 个问题(一)文章目录[深度解密Go语言之关于 interface 的 10 个问题(一)](https://mp.weixin.qq.com/s/EbxkBokYBajkCR-MazL0ZA)Go 语言与鸭子类型的关系值接收者和指针接收者的区别方法值接收者和指针接收者两者分别在何时使用iface 和 eface 的区别是什么接口的动态类型和动态值【引申1】接口类型和 `nil` 作比较【引申2】 来看一个例子,看一下它的输出:【引申3】如何打印出接口的原创 2021-12-20 19:00:00 · 275 阅读 · 0 评论 -
Go底层 — 反射①
文章目录反射概念关于静态类型特殊的静态类型interface特殊的interface类型interface类型是如何表示的反射三定律反射第一定律:反射可以将interface类型变量转换成反射对象反射第二定律:反射可以将反射对象还原成interface对 象反射第三定律:反射对象可修改,value值必须是可设置的总结反射概念官方对此有个非常简明的介绍两句话耐人寻味:反射提供一种让程序检查自身结构的能力反射是困惑的源泉第1条,再精确点的描述是“反射是一种检查interface变量的底层类型原创 2021-12-19 21:51:57 · 181 阅读 · 0 评论 -
go 并发控制(三)-Context实现原理
文章目录Context实现原理接口定义Deadline()Done()Err()Value()空ContextcancelCtxDone()接口实现Err()接口实现cancel()接口实现WithCancel()方法实现典型使用案例timerCTXDeadline() 接口实现cancel()接口实现WithDeadline()方法实现WithTimeout()方法实现典型使用案例valueCtxValue()接口实现WithValue()方法实现典型使用案例总结Context实现原理context原创 2021-12-14 20:30:00 · 1321 阅读 · 0 评论 -
go 并发控制(二)-WaitGroup
文章目录WaitGroup前言基础知识信号量WaitGroup数据结构Add(delta int)wait()Done()编程TipsWaitGroup前言WaitGroup是Golang应用开发过程中经常使用的并发控制技术WaitGroup可理解为Wait-Goroutine-Group即等待一组goroutine结束比如某个goroutine需要等待其他几个goroutine全部完成那么使用WaitGroup可以轻松实现下面程序展示了一个goroutine等待另外两个go原创 2021-12-14 09:30:00 · 263 阅读 · 0 评论 -
go 并发控制(一)-channel
Channel文章目录ChannelChannel前言场景示例总结Channel前言channel一般用于协程之间的通信channel也可以用于并发控制比如主协程启动N个子协程主协程等待所有子协程退出后再继续后续流程这种场景下channel也可轻易实现场景示例下面程序展示一个使用channel控制子协程的例子:package mainimport ( "fmt" "time")func Process(ch chan int) { // Do some wor原创 2021-12-13 21:59:42 · 243 阅读 · 0 评论 -
go底层系列-mutex原理剖析
go底层系列-mutex原理剖析文章目录go底层系列-mutex原理剖析前言Mutex数据结构Mutex结构体Mutex方法加解锁过程简单加锁加锁被阻塞简单解锁解锁并唤醒协程自旋过程什么是自旋?自旋条件自旋的优势自旋的问题Mutex模式normal模式starvation模式woken状态为什么重复解锁要panic编程Tipsrwmutex前言读写锁数据结构类型定义接口定义Lock()实现逻辑Unlock()实现逻辑RLock()实现逻辑RUnlock()实现逻辑场景分析写操作是如何阻止写操作的写操作是如原创 2021-12-13 09:45:00 · 702 阅读 · 0 评论 -
go底层系列-range原理剖析
range文章目录range前言热身实现原理range for slicerange for arrayrange for maprange for channel编程Tips总结前言range是Golang提供的一种迭代遍历手段可操作的类型有数组、切片、Map、channel等实际使用频率非常高热身func RangeSlice(slice []int) { for index, value := range slice { _, _ = index, value }原创 2021-12-12 21:19:30 · 908 阅读 · 0 评论 -
go底层系列-select原理剖析
select文章目录select前言热身实现原理case数据结构select实现逻辑selectgo实现伪代码如下:总结前言select是Golang在语言层面提供的多路IO复用的机制可以检测多个channel是否ready(即是否可读或可写)使用起来非常方便热身// 下面的程序输出是什么?func main() { chan1 := make(chan int) chan2 := make(chan int) go func() { chan1 <- 1 time原创 2021-12-12 09:15:00 · 592 阅读 · 0 评论 -
go底层系列-string底层实现
String文章目录String数据结构string操作声明[]byte转stringstring转[]byte字符串拼接为什么字符串不支持修改?[]byte转换成string一定会拷贝内存吗?string和[]byte如何取舍go标准库 builtin 给出了所有内置类型的定义。源代码位于 src/builtin/builtin.gostring是8比特字节的集合通常但并不一定是UTF-8编码的文本。另外,还提到了两点,非常重要:string可以为空(长度为0),但不会是nilstri原创 2021-12-11 09:00:00 · 619 阅读 · 0 评论 -
go底层系列-struct底层实现
struct文章目录struct前言Tag的本质Tag规则Tag是Struct的一部分获取TagTag存在的意义Tag常见用法前言Go的struct声明允许字段附带 Tag 来对字段做一些标记。该 Tag 不仅仅是一个字符串那么简单,因为其主要用于反射场景reflect 包中提供了操作 Tag 的方法,所以 Tag 写法也要遵循一定的规则。Tag的本质Tag规则Tag 本身是一个字符串,但字符串中却是: 以空格分隔的 key:value 对 。key : 必须是非空字符串,字符串不原创 2021-12-10 22:30:00 · 718 阅读 · 0 评论 -
go底层系列-channel底层实现
chanchan数据结构环形队列等待队列类型信息锁channel读写创建channel创建伪代码向channel写数据图示从channel读数据图示关闭channel常见用法单向channel实例select实例结论range实例chanchannel是Golang在语言层面提供的goroutine间的通信方式主要用于进程内各goroutine间通信跨进程通信,建议使用分布式系统的方法来解决数据结构环形队列作为缓冲区长度是创建chan时指定的下图展示了一个可缓存6个原创 2021-12-09 21:15:10 · 1370 阅读 · 0 评论 -
go底层系列-slice底层实现
sliceslice前言热身环节实现原理数据结构使用make创建Slice例如使用数组创建Slice例如Slice扩容例如Slice Copy特殊切片例如编程TipsSlice总结slice前言又称动态数组,依托数组实现方便的进行扩容、传递等正因为灵活,如果不了解其内部实现机制,有可能遭遇莫名的异常现象。热身环节// 题目一package mainimport "fmt"func main() { var array [10]int var slice = array[5:6原创 2021-12-10 05:30:00 · 663 阅读 · 0 评论 -
go底层系列-map底层实现
mapmap示例数据结构示例哈希冲突示例负载因子渐进式扩容扩容的前提条件增量扩容示例等量扩容查找过程插入过程参考map的整体结构图hmapbucketmap使用哈希表作为底层实现一个哈希表里可以有多个哈希表节点,也即bucket每个bucket就保存 了map中的一个或一组键值对示例下图展示一个拥有4个bucket的map:本例中, hmap.B=2 , 而hmap.buckets长度是2^B为4.元素经过哈希运算后会落到某个bucket中进行存储查找过程类似bucket 很多原创 2021-12-10 17:30:00 · 3637 阅读 · 1 评论 -
go底层系列-iota底层实现
iota文章目录iota前言热身规则编译原理前言我们知道iota常用于const表达式中我们还知道其值是从零开始const声明块中每增加一行iota值自增1使用iota可以简化常量定义,但其规则必须要牢牢掌握热身// 下面常量定义源于GO源码,下面每个常量的值是多少?package maintype Priority intconst ( LOG_EMERG Priority = iota LOG_ALERT LOG_CRIT LOG_ERR LOG_WARNING原创 2021-12-10 17:00:00 · 230 阅读 · 0 评论 -
go底层系列-defer原理剖析
go底层系列-defer原理剖析目录go底层系列-defer原理剖析defer前言热身defer规则规则一:延迟函数的**参数在defer语句出现时就已经确定下来**了规则二:延迟函数执行按后进先出顺序执行,即**先出现的 defer最后执行**规则三:延迟函数可能操作主函数的具名返回值函数返回过程主函数拥有匿名返回值,返回字面值主函数拥有匿名返回值,返回变量主函数拥有具名返回值defer 实现原理defer 数据结构defer的创建和执行总结defer前言defer语句用于延迟函数的调用每原创 2021-12-11 16:45:00 · 562 阅读 · 0 评论