golang面试题
文章平均质量分 78
这个主要是我在准备校招中所遇到的golang相关面试题,有的是自己遇到的,有的是在牛客网中找的别人的golang面试题。
终生成长者
Golang、MySQL、Redis、计算机网络、操作系统、数据结构。
展开
-
golang—面试题大全
Go中Map是一个KV对集合。底层使用hash table,用链表来解决冲突 ,出现冲突时,不是每一个Key都申请一个结构通过链表串起来,而是以bmap为最小粒度挂载,一个bmap可以放8个kv。每个map的底层结构是hmap,是有若干个结构为bmap的bucket组成的数组。每个bucket底层都采用链表结构。bmap 就是我们常说的“桶”,桶里面会最多装 8 个 key,这些 key之所以会落入同一个桶,是因为它们经过哈希计算后,哈希结果是“一类”的,关于key的定位我们在map的查询和赋值中详细说明。原创 2023-08-13 21:21:28 · 5095 阅读 · 2 评论 -
Golang并发控制
开发 go 程序的时候,时常需要使用 goroutine 并发处理任务,有时候这些 goroutine 是相互独立的,需要保证并发的数据安全性,也有的时候,goroutine 之间要进行同步与通信,主 goroutine 需要控制它所属的子goroutine。原创 2023-07-23 20:31:12 · 862 阅读 · 0 评论 -
Go语言的连接复用
Go语言中IO多路复用使用netpool模型。原创 2023-07-23 20:21:24 · 377 阅读 · 0 评论 -
go函数参数传递到底是值传递还是引用传递?
go函数全是值传递,没有引用传递!!!go函数全是值传递,没有引用传递!!!go函数全是值传递,没有引用传递!!!go函数全是值传递,没有引用传递!!!go函数全是值传递,没有引用传递!!!原创 2023-07-04 14:13:37 · 439 阅读 · 0 评论 -
Go语言unsafe包详解
Go语言的unsafe包提供了一些不安全的操作,可以直接操作指针和内存,这些操作在一些特殊场景下非常有用。但是,由于这些操作不受Go语言的类型系统和内存管理机制的限制,因此使用不当可能会导致内存泄漏、数据损坏等问题,需要谨慎使用。Alignof函数返回一个类型的对齐方式,单位为字节。String函数返回一个指针指向的内存区域的字符串。Sizeof函数返回一个类型的大小,单位为字节。Add函数返回一个指针加上一个偏移量后的新指针。Slice函数返回一个指针指向的内存区域的切片。原创 2023-04-13 15:06:06 · 596 阅读 · 0 评论 -
常用调试golang的bug以及性能问题的实践方法
所以我们要是想得到cpu性能,就是要获取到当前进程的profile文件,这个文件默认是30s生成一个,所以你的程序要至少运行30s以上(这个参数也可以修改,稍后我们介绍)这里面能够通过pprof查看包括(阻塞信息、cpu信息、内存堆信息、锁信息、goroutine信息等等), 我们这里关心的cpu的性能的profile信息.2、如果此时在top指令查询内存的时候,如果依然是800+MB,说明垃圾回收器回收了应用层的内存后,(可能)并不会立即将内存归还给系统。您可以在秒GET参数中指定持续时间。原创 2023-02-15 17:53:51 · 606 阅读 · 3 评论 -
golang_逃逸分析
所谓逃逸分析(Escape analysis)是指由编译器决定内存分配的位置,不需要程序员指定。函数中申请一个新的对象如果分配在栈中,则函数执行结束可自动将内存回收如果分配在堆中,则函数执行结束可交给GC(垃圾回收)处理有了逃逸分析,返回函数局部变量将变得可能,除此之外,逃逸分析还跟闭包息息相关。1.栈上分配内存比在堆中分配内存有更高的效率2.栈上分配的内存不需要GC处理3.堆上分配的内存使用完毕会交给GC处理4.逃逸分析目的是决定内分配地址是栈还是堆5.逃逸分析在编译阶段完成。原创 2022-12-08 16:31:15 · 1665 阅读 · 0 评论 -
golang垃圾回收原理
所谓垃圾就是不再需要的内存块,这些垃圾如果不清理就没办法再次被分配使用,在不支持垃圾回收的编程语言里,这些垃圾内存就是泄露的内存。Golang的垃圾回收(GC)也是内存管理的一部分。简单的说,垃圾回收的核心就是标记出哪些内存还在使用中(即被引用到),哪些内存不再使用了(即未被引用),把未被引用的内存回收掉,以供后续内存分配时使用。下图展示了一段内存,内存中既有已分配掉的内存,也有未分配的内存,垃圾回收的目标就是把那些已经分配的但没有对象引用的内存找出来并回收掉:上图中,内存块1、2、4号位上的内存块已原创 2022-12-05 11:12:47 · 677 阅读 · 0 评论 -
go内存分配原理
编写过C语言程序的肯定知道通过malloc()方法动态申请内存,其中内存分配器使用的是glibc提供的ptmalloc2。 除了glibc,业界比较出名的内存分配器有Google的tcmalloc和Facebook的jemalloc。二者在避免内存碎片和性能上均比glibc有比较大的优势,在多线程环境中效果更明显。Golang中也实现了内存分配器,原理与tcmalloc类似,简单的说就是维护一块大的全局内存,每个线程(Golang中为P)维护一块小的私有内存,私有内存不足再从全局申请。另外,内存分配与GC(原创 2022-12-04 15:54:10 · 647 阅读 · 2 评论 -
Golang协程调度
Goroutine调度是一个很复杂的机制,尽管Go源码中提供了大量的注释,但对其原理没有一个好的理解情况下去读源码收获不大。下面尝试用简单的语言描述一下Goroutine的调度机制。原创 2022-11-25 09:44:28 · 802 阅读 · 0 评论 -
golang_struct
Go的struct声明允许字段附带Tag来对字段做一些标记。该Tag不仅仅是一个字符串那么简单,因为其主要用于反射场景,reflect包中提供了操作Tag的方法,所以Tag写法也要遵循一定的规则。原创 2022-11-22 19:27:06 · 275 阅读 · 0 评论 -
map底层实现原理
每个哈希表的实现对负载因子容忍程度不同,比如Redis实现中负载因子大于1时就会触发rehash,而Go则在在负载因子达到6.5时才会触发rehash,因为Redis的每个bucket只能存1个键值对,而Go的bucket可能存8个键值对,所以Go可以容忍更高的负载因子。上图可见,overflow的bucket中大部分是空的,访问效率会很差。这样,我们实际上每次修改的都是指针所指向的Student空间,指针本身是常指针,不能修改,只读属性,但是指向的Student是可以随便修改的,而且这里并不需要值拷贝。原创 2022-11-22 17:31:11 · 4487 阅读 · 1 评论 -
Slice底层实现原理
1.每个切片都指向一个底层数组2.每个切片都保存了当前切片的长度、底层数组可用容量3.使用len()计算切片长度时间复杂度为O(1),不需要遍历切片4.使用cap()计算切片容量时间复杂度为O(1),不需要遍历切片5.通过函数传递切片时,不会拷贝整个切片,因为切片本身只是个结构体而已6.使用append()向切片追加元素时有可能触发扩容,扩容后将会生成新的切片。原创 2022-11-22 11:18:54 · 287 阅读 · 1 评论 -
channel底层实现原理
channel是Golang在语言层面提供的goroutine间的通信方式,比Unix管道更易用也更轻便。channel主要用于进程内各goroutine间通信,原创 2022-11-21 21:37:33 · 1432 阅读 · 0 评论 -
go面试题——defer的知识点
defer语句用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行。为了方便描述,我们把创建defer的函数称为主函数,defer语句后面的函数称为延迟函数。延迟函数可能有输入参数,这些参数可能来源于定义defer的函数,延迟函数也可能引用主函数用于返回的变量,也就是说延迟函数可能会影响主函数的一些行为。这个规则很好理解,定义defer类似于入栈操作,执行defer类似于出栈操作。原创 2022-11-05 14:39:18 · 781 阅读 · 0 评论 -
Go语言优劣势
Go语言保证了既能达到静态语言的安全和性能,又能达到动态语言开发维护的高效率,使用一个表达式来形容Go语言:Go =C+Python,说明Go语言既有C静态语言的运行速度,又能达到Python动态语言的快速开发。总而言之,Go语言对于当前大多数主流语言来讲,最大的优势在于具有较高的生产效率、先进的依赖管理和类型系统,以及原生的并发计算支持。从分布式计算的角度来看,Go语言的成熟度不及 Erlang(现在已经出现了一些这方面的Go语言代码包,我们已经可以看到光明的未来了)。原创 2022-10-11 20:20:42 · 1383 阅读 · 0 评论 -
Go基础面试题
首先make和new均是Go语言的内置的用来分配内存的函数。但是适用的类型不同:前者适用于slice ,map,channel 等引用类型,后者用于int型,数组,结构体等值类型。其次,两者的函数形式及调用形式不同,函数形式如下:前者返回一个值,后者返回一个指针。使用上,make返回初始化之后的类型的引用,new会为类型的新值分配已置零的内存空间,并返回指针。例如:“…”表示可以传一个或多个实参,这使得函数调用更加灵活。例如:进程(process):程序在操作系统中的一次执行过程,系统进行资源分配和调度的一原创 2022-06-15 21:38:45 · 502 阅读 · 0 评论