跳到主要内容

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 的内存分配器分配,并由垃圾收集器回收。与栈不同的是 应用程序在运行时