2025面试Go真题第一场

news/2025/2/27 9:43:54

前几天参加了一场面试,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 := 42
    return &x // x逃逸到堆上
}
  1. 闭包引用局部变量

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

func main() {
    f := func() int {
        x := 10
        return 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.niftyadmin.cn/n/5869900.html

相关文章

Linux 文字转语音包 eSpeak 的使用方法详解

一、安装 eSpeak 1. 更新软件包列表 在终端中运行以下命令,确保系统中的软件包列表是最新的: sudo apt-get update2. 安装 eSpeak 运行以下命令安装 eSpeak: sudo apt-get install espeak3. 验证安装 安装完成后,可以通过以…

Neo4j使用neo4j-admin导入csv数据方法

在neo4j desktop里创建project,创建dbms,创建database。 将csv文件放入如下import路径中,然后就可以使用相对路径来使用csv了。 在neo4j desktop中打开Terminal 键入导入数据语句: neo4j-admin database import full --nodes&qu…

对 flask 框架中的全局变量 request 探究

在 Python 的 Web 开发框架 flask 中有这样的四个全局变量,我们经常会使用它们来存取数据,在处理请求过程中它们是非常方便的,因为它们的实现方法是相同的,所以这里我们重点探究一下 request 的使用,其它的都是类似的。…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应&…

【Uniapp-Vue3】点击将内容复制到剪切板

具体使用方法在官网: uni-app官网https://uniapp.dcloud.net.cn/api/system/clipboard.html大致使用方法如下: // value是需要复制的值 function copyValue (value) { uni.setClipboardData({data: value,success: res>{// 复制成功逻辑},fail:err&…

Java基础关键_011_ String 类与正则表达式(二)

目 录 一、正则表达式 1.说明 2.应用 3. 相关方法 (1)replace(CharSequence target, CharSequence replacement) (2)replaceAll(String regex, CharSequence replacement) (3)split(String regex) &…

Go 1.24版本在性能方面有哪些提升?

Go 1.24版本在性能方面有多项显著提升,主要包括以下几点: 基于Swiss Tables的新内置map实现:这种实现方式通过压缩索引和更高效的查找机制,降低了内存使用量并提高了查询速度。根据测试,某些场景下性能提升接近50%[1][…

【Akashic Records】《命若琴弦》

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Akashic Records 文章目录 💯观后感命运的无情与生命的坚持希望的火种与人生的意义虚无与活在当下生死的辩证与享受当下结语 💯观后感 命若琴弦 生命的意义本不在向外的寻取,而在…