MST

星途 面试题库

面试题:Go中使用context传递数据的常规方法及替代方案

在Go语言中,通常如何使用context传递数据?请列举至少两种不使用context传递数据的替代方案,并说明各自的适用场景。
35.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

使用context传递数据

在Go语言中,通常使用context.WithValue方法来传递数据。context.WithValue接受一个父context和一对键值对,然后返回一个带有新键值对的新context。下游函数可以通过ctx.Value(key)方法获取对应的值。例如:

package main

import (
    "context"
    "fmt"
)

func main() {
    ctx := context.Background()
    ctx = context.WithValue(ctx, "key", "value")
    doSomething(ctx)
}

func doSomething(ctx context.Context) {
    value := ctx.Value("key")
    if str, ok := value.(string); ok {
        fmt.Println(str)
    }
}

不使用context传递数据的替代方案及适用场景

  1. 函数参数传递
    • 适用场景:当数据的作用范围明确且局限于特定函数调用链时,通过函数参数传递数据是最直接和清晰的方式。例如,在一个简单的业务逻辑函数中,需要传入特定的配置信息来执行任务。
    • 示例
package main

import "fmt"

func doWork(config string) {
    fmt.Println("Using config:", config)
}

func main() {
    config := "specific config"
    doWork(config)
}
  1. 全局变量
    • 适用场景:当数据需要在整个应用程序的多个地方频繁使用,且不依赖于特定的调用链或执行流程时,可以使用全局变量。例如,应用程序的配置信息,在很多不同的模块中都可能需要读取。
    • 示例
package main

import "fmt"

var globalConfig string

func init() {
    globalConfig = "global config"
}

func doWork() {
    fmt.Println("Using global config:", globalConfig)
}

func main() {
    doWork()
}