当前位置: 首页 > news >正文

Golang 面试题

常见的 Go 语言面试题及其答案和代码示例:


一、高频面试题

1. Goroutine 和线程的区别?

答案:

  • Goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理,初始栈大小约为 2KB,可以动态扩展和收缩,创建和切换成本非常低。
  • 线程 是操作系统级别的线程,栈大小通常为 MB 级,创建和切换涉及内核态和用户态的切换,成本较高。
  • Go 使用 M:N 调度模型,将多个 Goroutine 映射到少量的操作系统线程上,从而高效利用 CPU 资源。

2. 如何避免 Goroutine 泄漏?

答案: 使用 context.Context 或通道来传递退出信号,确保 Goroutine 在完成任务后能够正确退出。

ctx, cancel := context.WithCancel(context.Background())
go func() {
   
    select {
   
    case <-ctx.Done(): // 接收取消信号
        fmt.Println("Goroutine 退出")
        return
    case <-time.After(2 * time.Second):
        fmt.Println("任务完成")
    }
}()
time.Sleep(1 * time.Second)
cancel() // 触发退出
time.Sleep(1 * time.Second) // 等待 Goroutine 退出

3. defer 的执行顺序?

答案: defer 语句按照后进先出(LIFO)的顺序执行。

func main() {
   
    defer fmt.Println("1")
    defer fmt.Println("2")
    defer fmt.Println("3")
    // 输出:3 2 1
}

4. defer 如何影响返回值?

示例:

// 命名返回值:返回 1
func f() (result int) {
   
    defer func() {
    result++ }()
    return 0
}

// 匿名返回值:返回 0
func f() int {
   
    result := 0
    defer func() {
    result++ }()
    return result
}

5. 实现一个 Worker Pool

代码示例:

func worker(id int, jobs <-chan int, results chan<- int) {
   
    for j := range jobs {
   
        fmt.Printf("Worker %d 处理任务 %d\n", id, j)
        results <- j * 2
    }
}

func main() {
   
    jobs := make(chan int, 10)
    results := make(chan int, 10)

    // 启动 3 个 Worker
    for w := 1; w <= 3; w++ {
   
        go worker(w, jobs, results)
    }

    // 发送任务
    for j := 1; j <= 5; j++ {
   
        jobs <- j
    }
    close
http://www.dtcms.com/a/25632.html

相关文章:

  • C#从零开始学习(图文教程),持续更新中~
  • Docker报错:https://registry-1.docker.io/v2/
  • TexTCNN
  • 【MySQL系列文章】Linux环境下安装部署MySQL
  • 基于 Java + SSM + JSP 的百货中心供应链管理系统设计与实现
  • 用deepseek学大模型04-机器学习建模过程
  • 排序与算法:选择排序
  • MySQL的基本使用
  • 了解SQL Server不同版本(如Express、Standard、Enterprise)的功能差异和适用场景。
  • LLM论文笔记 12: Teaching Arithmetic to Small Transformers
  • Linux-C/C++《C/7、字符串处理》(字符串输入/输出、C 库中提供的字符串处理函数、正则表达式等)
  • WordPress Ai插件:支持提示词生成文章和chat智能对话
  • 深入解析 Flutter Bloc:从原理到实战
  • python1
  • 零基础入门机器学习 -- 第九章机器学习项目实战
  • 数据结构_前言
  • 【基础架构篇二】《DeepSeek容器化部署:Docker+Kubernetes集群实战》
  • 【DL】浅谈深度学习中的知识蒸馏 | 输出层知识蒸馏
  • Spring中Bean的生命周期
  • React中如何处理高阶组件中的错误
  • WebGPU 命令编码机制解析:GPUCommandEncoder 与 GPURenderPassEncoder 的协作
  • 开源模型应用落地-DeepSeek-R1-Distill-Qwen-7B-LoRA微调-LLaMA-Factory-单机单卡-V100(一)
  • 调用deepseek接口
  • DeepSeek接入大数据能做什么
  • c# —— StringBuilder 类
  • three.js+WebGL踩坑经验合集(8.2):z-fighting叠面问题和camera.near的坑爹关系
  • C语言:在主函数中输入十个等长的字符串。用另一函数对它们排序,然后在主函数输出这10个已排好序的字符串。
  • 数据结构-栈、队列、哈希表
  • PyTorch与TensorFlow的对比:哪个框架更适合你的项目?
  • 什么是动态IP?静态IP和动态IP有什么区别?