MST

星途 面试题库

面试题:Go中Context API函数如何防止上下文泄漏

在Go语言中,使用Context API函数时,上下文泄漏可能会导致资源无法正确释放等问题。请描述你所知道的防止上下文泄漏的方法,并举例说明如何在实际代码中避免这种情况。
37.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

防止上下文泄漏的方法

  1. 正确管理goroutine生命周期:确保启动的goroutine能够及时结束,避免在上下文取消后仍在运行。每个启动的goroutine都应该监听上下文的取消信号。
  2. 使用WithCancel、WithTimeout或WithDeadline创建上下文:根据业务需求选择合适的上下文创建函数。例如,使用WithTimeout设置一个明确的超时时间,这样即使业务逻辑没有主动取消,时间一到也会自动取消上下文。
  3. 在函数返回前清理资源:如果函数中使用了需要清理的资源(如数据库连接、文件句柄等),在函数返回前要确保这些资源被正确关闭或释放,即使上下文被取消。

实际代码示例

package main

import (
    "context"
    "fmt"
    "time"
)

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    defer cancel()

    go func(ctx context.Context) {
        select {
        case <-time.After(3 * time.Second):
            fmt.Println("operation completed")
        case <-ctx.Done():
            fmt.Println("operation cancelled due to timeout")
        }
    }(ctx)

    time.Sleep(3 * time.Second)
}

在上述代码中:

  1. 使用context.WithTimeout创建了一个带有2秒超时的上下文ctx,同时返回取消函数cancel,并通过defer cancel()确保在函数结束时取消上下文,防止潜在的泄漏。
  2. 在goroutine中,通过select语句监听ctx.Done()通道,当上下文被取消(这里是超时导致取消)时,会打印相应的提示信息,及时结束goroutine,避免泄漏。