Golang面试题

在Golang(也称为Go语言)工程师的面试中,可能会遇到各种技术性和概念性的问题。

一、基础部分

  1. Golang 中 make 和 new 的区别?

    • 共同点:两者都用于分配内存。
    • 不同点
      • make 专为 slice、map 和 channel 设计,返回初始化后的(非零)值。
      • new 分配内存并返回指向该内存的指针,初始化为零值。
      • make 返回类型本身(不是指针),而 new 返回指向类型的指针。
  2. 数组和切片的区别?

    • 数组:固定长度,值类型,直接存储数据。
    • 切片:动态数组,引用类型,引用底层数组。切片是对数组的抽象,包含长度、容量和底层数组的指针。
  3. for range 在遍历切片或映射时,迭代变量的地址会发生变化吗?

    • 在 for range 循环中,每次迭代的 key 和 value 是对应元素的拷贝,不是引用。因此,它们的地址在每次迭代时都可能不同。
  4. Go 的 defer 语句的

### Golang 常见面试题及解决方案 以下是常见的 Golang 面试题,包括问题描述、解决方案以及代码示例: #### 1. Goroutine 的基本概念和使用方法 Goroutine 是 Golang 中实现并行计算的核心,通过 `go` 关键字可以轻松启动一个协程[^1]。它以异步方式运行,无需等待其完成即可继续执行后续代码。 ```go func main() { go func() { fmt.Println("Goroutine 运行中") }() fmt.Println("主程序运行中") time.Sleep(1 * time.Second) // 确保 Goroutine 有时间运行 } ``` #### 2. 错误处理机制 在 Golang 中,错误处理通常通过返回值中的 `error` 类型实现。可以通过标准库 `errors.New` 或自定义结构体的方式定义错误[^2]。 **代码示例:** ```go package main import ( "errors" "fmt" ) func divide(a, b int) (int, error) { if b == 0 { return 0, errors.New("除数不能为零") } return a / b, nil } func main() { result, err := divide(10, 0) if err != nil { fmt.Println("错误:", err) } else { fmt.Println("结果:", result) } } ``` #### 3. Make 的作用及用法 `make` 函数用于初始化切片、map 和 channel,并分配内存及初始化内容[^3]。以下是具体用法: - **切片初始化:** ```go slice := make([]int, 5) // 创建一个长度为 5 的切片 ``` - **Map 初始化:** ```go m := make(map[string]int) m["key"] = 10 ``` - **Channel 初始化:** ```go ch := make(chan int, 10) // 创建一个缓冲区大小为 10 的 channel ``` #### 4. 并发控制(WaitGroup 和 Channel) 并发控制是 Golang 面试中的重点。`sync.WaitGroup` 和 `channel` 是常用的同步工具。 **代码示例:** ```go package main import ( "fmt" "sync" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d 完成任务\n", id) } func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait() fmt.Println("所有任务完成") } ``` #### 5. 接口的实现与使用 接口是 Golang 中多态的实现方式。类型只要实现了接口定义的所有方法,就自动满足该接口。 **代码示例:** ```go package main import "fmt" type Animal interface { Speak() string } type Dog struct{} func (d Dog) Speak() string { return "汪汪" } type Cat struct{} func (c Cat) Speak() string { return "喵喵" } func main() { var animal Animal animal = Dog{} fmt.Println(animal.Speak()) // 输出: 汪汪 animal = Cat{} fmt.Println(animal.Speak()) // 输出: 喵喵 } ``` #### 6. Defer 的作用与用法 `defer` 语句用于延迟函数调用,直到包含它的函数返回时才执行。常用于资源释放场景。 **代码示例:** ```go package main import "fmt" func main() { defer fmt.Println("World") fmt.Println("Hello") } // 输出: // Hello // World ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道亦无名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值