2025面试Go真题第一场

devtools/2025/2/26 23:45:53/

前几天参加了一场面试,GoLang 后端工程师,他们直接给了我 10 道题,我留了一个截图。

image-20250224133316933

在看答案之前,你可以先简单做一下,下面我会对每个题目做一个说明。

文章目录

      • 1、golang map 是否并发安全?
      • 2、协程泄漏的原因可能是什么?
      • 3、关于channel操作正确的可能是?
      • 4、Golang字符串转成byte数组,会发生内存拷贝吗?
      • 5、请说一说Golang 的 GC可以怎么触发的?
      • 6、Channel是同步的还是异步的 ?
      • 7、defer在return返回前还是返回后执行?
      • 8、什么情况下可能会发生内存逃逸 ?
      • 9、Golang中有哪些方式可以安全读写共享变量?
      • 10、Golang协程为什么比线程轻量?
    • 最后

image-20250224144221700

golang_map__13">1、golang map 是否并发安全?

Go 语言中的原生 map 并不是并发安全的。在多 goroutine 并发读写同一个 map 时,可能会导致数据竞争(race condition),从而引发程序崩溃。

可以用 sync.Map

Go标准库中的 sync.Map 是一个并发安全的map实现。它内部通过读写分离的策略来减少锁争用,适用于读多写少的场景。例如:

var m sync.Map
m.Store("key", 42) // 存储键值对
value, ok := m.Load("key") // 获取值
m.Delete("key") // 删除键值对

2、协程泄漏的原因可能是什么?

在 Go 语言中,协程泄漏(Goroutine Leak)是指启动的协程无法正常退出,持续占用资源,最终可能导致程序崩溃或系统资源耗尽。

例如:

协程中存在无限循环,且没有退出条件。多个协程之间存在死锁,导致无法正常退出。总的来说就是协程没有释放、不受控制。

3、关于channel操作正确的可能是?

  • 从已关闭的 channel 接收数据:是可以的。
  • 向已关闭的 channel 发送数据:会导致运行时错误。
  • 关闭已关闭的 channel:会导致运行时错误。

4、Golang字符串转成byte数组,会发生内存拷贝吗?

不会。GoLang 底层字符串就是用 byte 数组存储的。

5、请说一说Golang 的 GC可以怎么触发的?

自动触发:堆内存达到阈值、时间周期触发、系统监控触发。

手动触发:调用 runtime.GC()

6、Channel是同步的还是异步的 ?

无缓冲通道:同步。

ch := make(chan int) // 创建一个无缓冲通道

有缓冲通道:异步。

ch := make(chan int, 2) // 创建一个缓冲大小为2的通道

7、defer在return返回前还是返回后执行?

在函数真正返回给调用者之前执行。

8、什么情况下可能会发生内存逃逸 ?

在Go语言中,内存逃逸(Memory Escape)是指变量被分配到堆上,而不是栈上。这通常发生在Go编译器无法确定变量是否会在函数外部被引用时。以下是一些可能导致内存逃逸的常见场景:

  1. 返回局部变量的指针

如果函数返回了局部变量的指针,该变量会被分配到堆上,因为其生命周期需要超出函数的作用域。

func createPointer() *int {x := 42return &x // x逃逸到堆上
}
  1. 闭包引用局部变量

如果闭包引用了局部变量,这些变量可能会被分配到堆上。

func main() {f := func() int {x := 10return x}fmt.Println(f()) // f会导致x逃逸到堆上
}

还有多种情况,这个有一定难度,我会再单开一篇继续讲解。

9、Golang中有哪些方式可以安全读写共享变量?

  • 使用互斥锁(sync.Mutex)
  • 使用读写锁(sync.RWMutex)
  • 使用原子操作(sync/atomic)
  • 使用通道(channel)
  • 使用sync.Map进行并发访问

10、Golang协程为什么比线程轻量?

  • 调度开销更小,协程的切换由Go运行时管理,上下文切换的开销非常小,通常只需要几十纳秒。
  • 协程的内存占用,Go协程:栈空间的初始大小非常小(通常为2KB),并且会根据需要动态扩展。这种动态栈分配机制使得协程的内存占用非常低。
  • 协程的轻量级结构:Go协程的内部结构简单,主要包含协程状态、栈指针等信息,而操作系统线程需要维护更多的内核资源。
  • Go运行时通过多路复用(Multiplexing)的方式将协程映射到少量的操作系统线程上,从而实现高效的并发执行。多路复用机制、高并发能力。
  • 阻塞处理:协程阻塞时,运行时会自动切换到其他协程,充分利用CPU。
  • Go协程:协程的创建和销毁由Go运行时管理,开销极小。创建和销毁协程的成本非常低,因为它们不需要操作系统内核的介入。

最后

离线版PDF下载:
链接: https://pan.baidu.com/s/1zsffbsHj5CRC9whL7W-9aw?pwd=6666 提取码: 6666 

http://www.ppmy.cn/devtools/162913.html

相关文章

比较RPC和RESTful API的优缺点

RPC和RESTful API是两种不同的远程调用方式,它们各自具有不同的优缺点。 RPC的优点包括: 高效:RPC使用自定义的通信协议,可以减少报文传输量,提高传输效率。灵活:RPC支持多种语言,不同的编程语…

代码审计入门学习

简介 HadSky轻论坛程序为个人原创PHP系统,作者为蒲乐天,后端基于puyuetianPHP框架驱动,前端基于 puyuetianUI框架驱动,默认编辑器为puyuetianEditor富文本编辑器,其他非原创框架及驱动JQuery.js 及Font-Awesome字体库…

AI安全相关漏洞

最近AI大模型上线,除开常规的系统漏洞外,也涌现出很多新的漏洞,这篇文章对于新的一些漏洞进行一些整理,后期进行进一步的复现。 1. 对抗攻击(Adversarial Attacks) 攻击机制: 通过在输入数据中添…

【Mysql】我在广州学Mysql 系列——Mysql 性能优化

ℹ️大家好,我是练小杰,今天又是美好的星期一了,新的工作又要开始了,努力!!奋斗!!😆 本文是针对Mysql 性能优化知识进行学习与讨论,后续将添加更多相关知识噢…

DeepSeek在MATLAB上的部署与应用

在科技飞速发展的当下,人工智能与编程语言的融合不断拓展着创新边界。DeepSeek作为一款备受瞩目的大语言模型,其在自然语言处理领域展现出强大的能力。而MATLAB,作为科学计算和工程领域广泛应用的专业软件,拥有丰富的工具包和高效…

[VSCode]彻底卸载和重装,并搭建Java开发环境

VSCode彻底卸载 由于当初是朋友帮忙装的,所以准备卸载,自己装一遍 从控制面板找到 vscode 将其卸载。 此时仅仅是删除了应用软件 删除安装插件 在图示路径中找到 .vscode 文件夹,将其删除,即可彻底清除安装的插件 C:\Users\user\.vscode …

matlab 海浪模型和舰艇动力学模型

1、内容简介 matlab148-海浪模型和舰艇动力学模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

清华大学DeepSeek文档下载,清华大学deepseek下载(完成版下载)

文章目录 前言一、清华大学DeepSeek使用手册下载二、清华大学DeepSeek使用手册思维导图 前言 这是一篇关于清华大学deepseek使用手册pdf的介绍性文章,主要介绍了DeepSeek的定义、功能、使用方法以及如何通过提示语设计优化AI性能。以下是对这些核心内容的简要概述&…