跳到主要内容

Go 面试基础

列举 Go 语言中 * 号的所有用法​

linux 调度问题​

介绍一下 大对象 小对象 为啥小对象多了会造成gc 压力​

请简述一下go 是如何分配内存的​

知道golang的内存逃逸 什么情况下会发生内存逃逸​

谈谈内存泄漏,什么情况下会发生内存泄漏 怎么定位排查内存泄漏问题​

GC 的触发时机​

GC 中stw 时机,各个阶段是如何解决的​

go 的gc 算法是怎么实现的​

go gc 是怎么实现的​

如何优雅的实现一个 goroutine池​

多个goroutine 对同一个map 写会panic ,异常是否可以用defer 捕获​

怎么控制并发数​

抢占式调度 是如何抢占的​

进程 线程 协程 有什么区别​

什么是GMP​

map的数据结构是什么,是怎么实现扩容的​

nil map 和空 map 有何不同​

怎么处理对map 进行并发访问,有没有什么其它方案,区别是什么​

map中删除一个key,它的内存是否释放​

map循环是有序的还是无序​

map 使用注意点,并发安全吗​

向channel 发送数据和从channel读数据的流程是怎么样的​

nil,关闭的channel,有数据的channel,再进行读写关闭会发生怎么样​

go channel的底层实现原理​

channel 是否线程安全,锁用在什么地方​

golang 中 make 和new 的区别​

for range 的时候它的地址会发生变化吗​

go defer,多个defer的顺序,defer 在什么时机会 修改返回值​

unint 类型溢出​

介绍一下 rune 类型​

golang 中解析tag是怎么实现的,反射的原理是什么​

调用函数传入结构体时,应传值 还是指针​

context 结构是什么​

context 使用场景和用途​

切片​

比较

切片之间是不能比较,我们不能通过==操作符来判断两个切片是否包含全部相等的元素

判断是否为空

检查切片是否为空 len(s)==0 ;不能使用 s==nil;其根本原因在于后面两种初始化方式已经给切片分配了空间,所以就算切片为空,也不等于 nil。但是 len(s) == 0 成立,则切片一定为空。

引用类型​

指针,切片(slice),接口(interface),管道(channel)

指针和引用区别​

  1. 值类型在内存中存储的是指本身,而引用类型在内存中存储的是值的内存地址
  2. 值类型内存通常在栈中分配,引用类型内存在堆中分配

垃圾回收​

引用类型的内存在堆中分配,当没有任何变量引用堆中的内存地址时,改内存地址对应的数据存储空间就变成了垃圾,就会被 GO 语言的 GC 回收

堆和栈​

栈

在 GO 中,栈的内存是由编译器自动进行分配和释放,栈区往往存储着函数参数,局部变量和调用函数帧,它们随着函数的创建而分配,函数退出而销毁

一个 goroutine 对应一个栈,栈是调用栈的简称. 一个栈通常又包含了许多栈帧,它描述的是函数之间的调用关系,每一帧对应一次尚未返回的函数调用,它本身也是以栈形式存放数据

堆

与栈不同的是,应用程序在运行时只会存在一个堆。狭隘地说,内存管理只是针对堆内存而言的。程序在运行期间可以主动从堆上申请内存,这些内存通过 Go 的内存分配器分配,并由垃圾收集器回收。与栈不同的是 应用程序在运行时