精选700道Golang面试题及答案详解,看完面试不慌了
- 如何知道一个对象是分配在栈上还是堆上?
- go slice是怎么扩容的?
- 为什么有协程泄露(Goroutine Leak)?
- Go 可以限制运行时操作系统线程的数量吗? 常见的goroutine操作函数有哪些?
- 如何控制协程数目。
- new和make的区别?
- 数组和切片的区别?
- for range 的时候它的地址会发生变化么?for 循环遍历 slice 有什么问题?
- go defer,多个 defer 的顺序,defer 在什么时机会修改返回值?
- golang协程为什么比线程轻量?
- Golang中数组与切片比较?
- make和new的区别? go语言中的引用类型包含哪些?
- uint,int区别?
- 说说go语言的channel特性?
- 线程模型有哪些?为什么 Go Scheduler 需要实现 M:N 的方案?Go Scheduler 由哪些元素构成呢?
- context包的用途?
- 简述一下你对Go垃圾回收机制的理解?
- 混合写屏障?
- 原子操作(sync/atomic包)与互斥锁相比,有什么优势和局限性?
- 什么是逃逸分析?Go 编译器如何通过逃逸分析优化内存分配?
- 哪些场景下变量会发生逃逸?请举例说明。
- Go 的垃圾回收(GC)采用什么算法?其核心流程是什么?
- 如何减少 Go 程序的 GC 压力?
- 什么是内存泄漏?Go 中常见的内存泄漏场景有哪些?
- 接口的动态类型和动态值分别指什么?空接口(interface{})在内存中如何存储?
- 什么是接口断言?类型断言失败会发生什么?如何安全地进行类型断言?
- 类型T和T的方法集有什么区别?一个接口I要求实现方法M(),T和T是否都能实现I?
- 什么是 “接口污染”?如何避免?
- 如何判断两个接口变量是否相等?
- defer语句的底层实现原理是什么?多个defer的执行顺序如何保证?
- defer语句中修改函数返回值会生效吗?为什么?
- 闭包捕获的变量是值拷贝还是引用?请举例说明闭包可能导致的问题。
- panic和error的使用场景有何不同?何时应使用panic?
- 如何在recover中区分不同类型的panic?
- Go 的单元测试中,t.Run的作用是什么?如何编写表格驱动测试?
- 基准测试(Benchmark)中,b.N的含义是什么?如何提高基准测试的准确性?
- 什么是类型别名(type A = B)和类型定义(type A B)?它们在方法集和类型转换上有何区别?
- for range循环遍历切片时,变量是值拷贝还是引用?修改遍历变量会影响原切片吗?
- 切片的cap在什么情况下会小于len?如何避免?
- map的遍历顺序是固定的吗?为什么?
- 如何实现一个线程安全的map?除了sync.RWMutex,还有其他方案吗?
- time.After和time.Ticker的区别是什么?使用time.After可能存在什么问题?
- string和[]byte相互转换的性能成本如何?如何优化频繁转换的场景?
- rune类型与byte类型的使用场景有何不同?如何正确遍历包含中文的字符串?
- 什么是 “值接收者” 和 “指针接收者”?如何选择使用哪种接收者?
- init函数的执行时机是什么?多个init函数的执行顺序如何?
- 反射(reflect包)的核心功能是什么?使用反射有哪些性能影响?
- 如何通过反射判断一个变量是否为nil?
- unsafe.Pointer的作用是什么?使用时需要注意什么?
- 如何通过unsafe包访问结构体的私有字段?
- 反射和unsafe包的使用场景有何区别?
- 如何使用pprof分析 Go 程序的 CPU 和内存性能?
- 什么是 “栈分裂”(stack splitting)?Go 的 goroutine 栈为什么能动态扩容?
- 如何优化 Go 程序的启动速度?
- go vet和golint的作用是什么?它们有什么区别?
- 如何检测 goroutine 泄漏?有哪些工具可用?
- 如何实现一个限流器(rate limiter)?Go 标准库中有相关实现吗?
- 如何实现一个简单的连接池?需要注意哪些问题?
- 单例模式在 Go 中如何实现?如何保证线程安全和懒加载?
- 如何实现一个简单的生产者 - 消费者模型?
- 什么是依赖注入?在 Go 中如何实现?
- Go 语言的主要特点是什么?
- Go 语言中的变量声明有几种方式?
- 什么是短变量声明?它有什么限制?
- Go 语言支持哪些基本数据类型?
- int 和 int32 在 Go 中有什么区别?
- 如何在 Go 中定义常量?
- Go 语言中的 iota 关键字有什么作用?
- 什么是类型别名?它与类型定义有何不同?
- Go 语言中的数组和切片有什么区别?
- 切片的长度和容量有什么区别?
- 如何向切片中添加元素?
- 什么是 map?如何创建一个 map?
- 如何检查 map 中是否存在某个键?
- ……
- ……
- ……
- 函数可以返回多个值吗?
- 什么是函数的参数和返回值?
- 什么是可变参数函数?如何定义?
- 什么是匿名函数?
- 什么是闭包?
- Go 语言中的 defer 语句有什么作用?
- defer 语句的执行顺序是怎样的?
- 什么是 panic 和 recover?它们有什么作用?
- 如何在 Go 中定义结构体?
- 如何访问结构体的字段?
- 什么是结构体指针?
- 如何为结构体定义方法?
- 方法接收者为值类型和指针类型有什么区别?
- 什么是接口?如何定义接口?
- 一个类型如何实现接口?
- 什么是空接口?它有什么用途?
- 如何判断接口变量的具体类型?
- Go 语言支持继承吗?如何实现类似继承的功能?
- 什么是包?如何创建和使用包?
- 包中的 init 函数有什么作用?执行顺序是怎样的?
- 如何导入其他包?
- 什么是可见性?如何控制标识符的可见性?
- Go 语言中的指针是什么?如何使用?
- 指针和引用有什么区别?
- 如何在 Go 中实现错误处理?
- 什么是自定义错误?如何创建?
- Go 语言中的 goroutine 是什么?
- 如何创建一个 goroutine?
- goroutine 和线程有什么区别?
- 什么是 channel?如何创建 channel?
- 如何通过 channel 进行 goroutine 之间的通信?
- channel 有哪些类型?
- 如何关闭 channel?关闭后的 channel 有什么特点?
- 什么是 select 语句?它有什么作用?
- 如何使用 waitgroup 等待多个 goroutine 完成?
- 如何编写单元测试?
- 如何进行基准测试?
- 什么是表格驱动测试?
- Go 语言中的协程调度模型是什么?
- GPM 模型指的是什么?
- 什么是工作窃取?
- Go 语言中的内存分配机制是怎样的?
- 什么是逃逸分析?
- 如何避免内存泄漏?
- Go 语言中的字符串是不可变的吗?
- 什么是 rune 类型?它与 byte 有什么区别?
- map 的底层实现是什么?
- go向关闭的channel发送和读取数据是否报错?
- Golang并发模型有几种?
- go分布式锁有几种?
- 定时器的实现原理?
- 负载均衡有几种方式?
- GC 中 stw 时机,各个阶段是怎么解决的?
- 互斥锁正常模式和饥饿模式有什么区别?
- Go语言中context 结构原理?说一说context 使用场景和用途?
- Golang中的sync.WaitGroup是什么?
- Golong中无缓冲的 channel 和 有缓冲的 channel 的区别?
- golang 中解析 tag 是怎么实现的?反射原理是什么?
- 调用函数传入结构体时,应该传值还是指针?
- 说说对slice的认识?
- slice扩容?
- context 结构是什么样的?
- context 使用场景和用途?
- channel 是否线程安全?锁用在什么地方?
- go channel 的底层实现原理?
- nil、关闭的 channel 再进行读、写、关闭会怎么样?
- 什么是标记清除法?
- 说说Go的三色标记法?
- 为什么说三色标记法是一个假阴性的算法?
- 什么是写屏障?
- Go的垃圾回收机制(GC)分为几步?
- STW是否会导致服务不可用?
- 什么是GMP调度模型?
- Go原生和GORM在连接MySQL上的差别?
- Gin框架有什么优势?
- GRPC是怎么连接的?
- GRPC和HTTP的区别?
- ……
- ……
- ……
👇👇👇答案详解及更多精彩内容,进入专题体验更佳👇👇👇
精选700道Golang面试题及答案详解


浙公网安备 33010602011771号