首页 > 解决方案 > 可以将字节切片转换为上下文吗?

问题描述

我有一个使用来自 beanstalkd 的消息的应用程序。您不能将上下文传递给 beanstalkd,您只能使用字节切片来发送消息。所以我将我的上下文转换为字节片。

要从传递的上下文传播,需要将其转换为 context.Context。这可能吗?

// Sending context
ctx := context.Background()

reqBodyBytes := new(bytes.Buffer)
json.NewEncoder(reqBodyBytes).Encode(ctx)

_, err = conn.Put(reqBodyBytes.Bytes(), 1, 0, 120*time.Second)

// Consuming context
_, body, err := conn.Reserve(120 * time.Second)
fmt.Println(string(body))

标签: gobeanstalkd

解决方案


一般来说,这是不可能的。context.Context是一个接口,标准库提供的实现不支持封送值。例如,返回将键值对存储在未导出字段中context.WithValue()的上下文实现(未导出类型)。*context.valueCtx

但由于它是一种接口类型,您可以提供确实提供编组和解组功能的实现。Context.Value()尽管如果您也想支持上下文的方法,您可能会在编组和解组任何类型的值时遇到困难。

一般来说,这不是一个好主意。Acontext.Context的意思是“在 API 边界和进程之间携带截止日期、取消信号和其他请求范围的值”。这不是你想要坚持/转移的东西。


推荐阅读