![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go面试
文章平均质量分 85
~庞贝
Go后端开发
展开
-
GoLang之T和*T的方法集
基于我们之前介绍过的类型元数据相关知识,T和*T是两种类型,分别有着自己的类型元数据,一些元数据相关知识t he兴替是两种类型,分别有着自己的类型元数据,而根据自定义类型的类型元数据可以找得到该类型关联的方法列表。既然T和T各有各的方法集,那为什么还要限制T和T不能定义同名方法,又怎么会有"*T的方法集包含T的方法集合“这种说法?原创 2022-10-01 16:42:45 · 1606 阅读 · 0 评论 -
Go实现分布式锁
在单机程序并发或并行修改全局变量时,需要对修改行为加锁以创造临界区。为什么需要加锁呢?原创 2022-09-30 21:37:38 · 1337 阅读 · 2 评论 -
Golang之接口底层分析
GoLang之接口的动态类型和动态值【引申1】接口类型和 作比较【引申2】【引申3】如何打印出接口的动态类型和值?GoLang之编译器自动检测类型是否实现接口GoLang之接口的构造过程是怎样的汇编行数操作10-14构造调用 的参数汇编行数操作15调用 【引申1】原创 2022-09-30 09:02:33 · 1322 阅读 · 0 评论 -
GoLang之iface 和 eface 的区别是什么?
实际上,这里存储的是第一个方法的函数指针,如果有更多的方法,在它之后的内存空间里继续存储。fun 字段放置和接口方法对应的具体数据类型的方法地址,实现接口调用方法的动态分派,一般在每次给接口赋值发生转换时会更新此表,或者直接拿缓存的 itab。这里只会列出实体类型和接口相关的方法,实体类型的其他方法并不会出现在这里。实体, 它表示接口的类型以及赋给这个接口的实体类型。则指向接口具体的值,一般而言是一个指向堆内存的指针。这些数据类型的结构体定义,是反射实现的基础。字段,表示空接口所承载的具体的实体类型。原创 2022-09-29 09:41:41 · 1332 阅读 · 0 评论 -
I/O 多路复用解析
单线程:某个 socket 阻塞,会影响到其他 socket 处理。多线程:当客户端较多时,会造成资源浪费,全部 socket 中可能每个时刻只有几个就绪。同时,线程的调度、上下文切换乃至它们占用的内存,可能都会成为瓶颈。提供了非阻塞调用的方式,从操作系统层面解决了阻塞问题。将 socket 是否就绪检查逻辑下沉到操作系统层面,避免大量系统调用。告诉你有事件就绪,但是没告诉你具体是哪个 FD。跟 select 基本类似,主要优化了监听1024的限制。原创 2022-09-21 18:30:58 · 808 阅读 · 0 评论 -
Golang之协程和IO多路复用更配
并发处理能力因而大幅提升,但是也并非没有问题,例如一个socket可读了,但是这回只读到了半条请求,也就是说需要再次等待这个socket可读,在继续处理下一个socket之前,需要记录下这个socket的处理状态,下一个这个socket可读时,也需要恢复上次保存的现场,才好继续处理。也就是说,在IO多路复用中实现业务逻辑时,我们需要随着事件的等待和就绪,而频繁的保存和恢复现场,这并不符合常规开发习惯,如果业务逻辑比较简单还好,若是较为复杂的业务场景,就是悲剧了。第二种IO多路复用实现方式:poll。原创 2022-09-20 11:33:39 · 1277 阅读 · 0 评论 -
GoLang之协程是怎样的存在
每个协程拥有自己的执行栈,可以保存自己的执行现场,所以可以由用户程序按需创建携程,携程主动让出执行权时,会保存执行现场,然后切换到其他协程。协程恢复执行时,会根据之前保存的执行现场,恢复到中断前的状态继续执行。让多线程模型下,内核(态)用户(态)两头忙,却依然疲于应对,协程这种灵活轻量的用户太调度模型便受到了广泛的关注,而真正让协程大放异彩的,是他在io多路复用中的应用。线程可以选择一个执行体来执行,此时cpu中指令指针就会指向这个执行体的执行入口,栈基和栈指针寄存器也会指向线程给他分配的执行栈。原创 2022-09-20 11:32:04 · 844 阅读 · 0 评论 -
GoLang之进程与线程
如果接下来要执行进程A中的线程a1,CPU的指令指针寄存器就会指向线程的执行入口,当前指向用户空间的程序指令,所以栈基和栈指针寄存器会记录用户栈的位置,可以看到程序执行时,CPU面向的是某个线程,所以才说线程是操作系统执行与调度的基本单位。例如接下来要从线程a1切换到线程a2,而这两个线程属于进程A,那么就只涉及到线程切换,只需要把线程a1的执行现场保存起来,后续再把指令指针,栈指针这些寄存器的值修改为线程a2的信息,修改一下内存中调度相关的数据结构,一次同进程间的线程切换就算完成了。原创 2022-09-19 16:09:07 · 762 阅读 · 0 评论 -
GoLang之channel的应用
Channel 和 goroutine 的结合是 Go 并发编程的大杀器。而 Channel 的实际应用也经常让人眼前一亮,通过与 select,cancel,timer 等结合,它能实现各种各样的功能。接下来,我们就要梳理一下 channel 的应用。原创 2022-09-18 15:44:58 · 910 阅读 · 0 评论 -
GoLang之如何优雅地关闭 channel
因此需要增加一个中间人,M 个 receiver 都向它发送关闭 dataCh 的“请求”,中间人收到第一个请求后,就会直接下达关闭 dataCh 的指令(通过关闭 stopCh,这时就不会发生重复关闭的情况,因为 stopCh 的发送方只有中间人一个)。例如,IsClosed 函数返回 true,但这时有另一个 goroutine 关闭了 channel,而你还拿着这个过时的 “channel 未关闭”的信息,向其发送数据,就会导致 panic 的发生。这样,第一个关闭 dataCh 的请求就会丢失。原创 2022-09-18 15:14:55 · 1724 阅读 · 0 评论 -
GO面试题集锦
负载因子 = 哈希表存储的元素个数 / 桶个数Go 官方发现:装载因子越大,填入的元素越多,空间利用率就越高,但发生哈希冲突的几率就变大。装载因子越小,填入的元素越少,冲突发生的几率减小,但空间浪费也会变得更多,而且还会提高扩容操作的次数Go 官方取了一个相对适中的值,把 Go 中的 map 的负载因子硬编码为 6.5 ,这就是 6.5 的选择缘由。这意味着在 Go 语言中,当 map 存储的元素个数大于或等于 6.5 * 桶个数 时,就会触发扩容行为。原创 2022-09-18 14:01:32 · 337 阅读 · 0 评论