面试题答案
一键面试使用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传递数据的替代方案及适用场景
- 函数参数传递
- 适用场景:当数据的作用范围明确且局限于特定函数调用链时,通过函数参数传递数据是最直接和清晰的方式。例如,在一个简单的业务逻辑函数中,需要传入特定的配置信息来执行任务。
- 示例:
package main
import "fmt"
func doWork(config string) {
fmt.Println("Using config:", config)
}
func main() {
config := "specific config"
doWork(config)
}
- 全局变量
- 适用场景:当数据需要在整个应用程序的多个地方频繁使用,且不依赖于特定的调用链或执行流程时,可以使用全局变量。例如,应用程序的配置信息,在很多不同的模块中都可能需要读取。
- 示例:
package main
import "fmt"
var globalConfig string
func init() {
globalConfig = "global config"
}
func doWork() {
fmt.Println("Using global config:", globalConfig)
}
func main() {
doWork()
}