头部广告

Golang面试题

日期:2025-09-02 18:40:33 栏目:javascript 阅读:
# Golang面试题精选

基础概念

1. 请解释Golang中的Goroutine和线程的区别?

Goroutine是Go语言的轻量级线程实现,由Go运行时管理。与操作系统线程相比,Goroutine的创建和销毁开销极小(初始栈仅2KB),且调度由Go运行时在用户态完成,不直接依赖操作系统内核。一个Go程序可以轻松创建数十万个Goroutine,而线程通常受限于系统资源。

2. 什么是channel?它有哪些特性?

Channel是Goroutine之间通信的管道,提供同步机制。主要特性包括:
- 类型安全:只能传递声明类型的值
- 阻塞机制:无缓冲channel同步发送和接收
- 可缓冲:指定容量的缓冲channel
- 单向限制:可声明为只发送或只接收
- select多路复用:同时监听多个channel操作

中级问题

3. 解释defer语句的执行顺序和特性

defer语句将函数调用推入栈中,当前函数返回前按LIFO顺序执行。关键特性:
- 参数立即求值:defer语句的参数在声明时确定
- 执行顺序逆序:多个defer按声明相反顺序执行
- 可修改命名返回值:defer函数能访问并修改命名返回值

示例:
```go
func test() (x int) {
defer func() { x++ }()
return 5 // 实际返回6
}
```

4. 如何避免Goroutine泄漏?

Goroutine泄漏预防措施:
- 总是设置超时context
- 使用带缓冲的channel避免阻塞
- 确保channel被正确关闭或消费
- 使用select配合default避免阻塞
- 通过waitgroup确保所有Goroutine完成

高级问题

5. 解释Go内存模型中的happens-before原则

Happens-before原则定义事件执行的先后顺序保证:
- channel操作:发送happens-before对应接收完成
- mutex锁:解锁happens-before后续加锁
- once.Do:执行happens-before所有返回
- init函数:包初始化happens-beforemain执行

6. 如何实现高性能的并发map?

标准map非并发安全,高性能方案:
```go
type SafeMap struct {
sync.RWMutex
data map[string]interface{}
}

// 分段锁方案更好
type SegmentMap []*MapSegment

type MapSegment struct {
sync.RWMutex
data map[string]interface{}
}
```

实际开发中推荐使用sync.Map(适合读多写少场景)或第三方并发map库。

实战编程题

7. 实现并发限流器

```go
type RateLimiter struct {
bucket chan time.Time
stop chan struct{}
}

func NewRateLimiter(rate int) *RateLimiter {
r := &RateLimiter{
bucket: make(chan time.Time, rate),
stop: make(chan struct{}),
}
for i := 0; i < rate; i++ {
r.bucket <- time.Now()
}
go r.refill(time.Second / time.Duration(rate))
return r
}

func (r *RateLimiter) refill(interval time.Duration) {
ticker := time.NewTicker(interval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
select {
case r.bucket <- time.Now():
default:
}
case <-r.stop:
return
}
}
}
```

这些题目涵盖了Go语言并发编程、内存模型和实际应用等关键知识点,准备面试时应当深入理解这些概念并能够熟练编写相关代码。

我来作答

关于作者

169

提问

13万+

阅读量

0

回答

146300

余额

2万+

被赞

2万+

被踩