英文:
Cant add Contex Value with Chi from interface
问题
我有来自接口的数据,并且我将其添加到上下文中。根据文档,使用context.WithValue(r.Context(), key, val)
可以实现。
我尝试添加一个键和值是可以的,但是如果超过一个就不行了。
result := map[string]interface{}{}
encoded, _ := json.Marshal(data)
json.Unmarshal(encoded, &result)
fmt.Println("data claim \n", result)
var ctx context.Context
for key, val := range result {
fmt.Printf("key %v value %v \n", key, val)
ctx = context.WithValue(r.Context(), key, val)
}
fmt.Println("ctx middleware \n", ctx)
在结果中,我有多个数据,但只有一个数据起作用。
英文:
i have data from interface, and i will add on context. from documentation is context.WithValue(r.Context(), key, val)
i try to add 1 key and value is work, but can't work if more than 1.
result := map[string]interface{}{}
encoded, _ := json.Marshal(data)
json.Unmarshal(encoded, &result)
fmt.Println("data claim \n", result)
var ctx context.Context
for key, val := range result {
fmt.Printf("key %v value %v \n", key, val)
ctx = context.WithValue(r.Context(), key, val)
}
fmt.Println("ctx middleware \n", ctx)
on result i have more than 1 data, but only 1 data is work.
答案1
得分: 1
请尝试这样做:
result := map[string]interface{}{}
encoded, _ := json.Marshal(data)
json.Unmarshal(encoded, &result)
fmt.Println("data claim \n", result)
ctx := r.Context()
for key, val := range result {
fmt.Printf("key %v value %v \n", key, val)
ctx = context.WithValue(ctx, key, val)
}
fmt.Println("ctx middleware \n", ctx)
看起来你一直在使用r.Context()
,但没有使用更新后的版本。
英文:
Could you please try this
result := map[string]interface{}{}
encoded, _ := json.Marshal(data)
json.Unmarshal(encoded, &result)
fmt.Println("data claim \n", result)
ctx:=r.Context()
for key, val := range result {
fmt.Printf("key %v value %v \n", key, val)
ctx = context.WithValue(ctx, key, val)
}
fmt.Println("ctx middleware \n", ctx)
Seems you are using r.Context()
all the time but not the updated one.
答案2
得分: 0
由于您在上下文键中使用了string
类型,这个问题已经在上下文文档中提到过了。
提供的键必须是可比较的,并且不应该是字符串类型或任何其他内置类型,以避免在使用上下文的包之间发生冲突。
以下是在上下文中获取和设置键/值的示例代码:
package main
import (
"context"
"log"
)
// 您需要定义一个类型来防止冲突
type key int
const fooKey key = 1
const barKey key = 2
func main() {
ctx := context.Background()
m := map[key]string{
fooKey: "foo",
barKey: "bar",
}
// 添加到上下文中
for k, v := range m {
ctx = context.WithValue(ctx, k, v)
}
// 从上下文中获取值
for k := range m {
v := ctx.Value(k).(string)
log.Println("value is: ", v)
}
}
英文:
Since you're using the type string
for the context key. This problem is already mentioned in the context document.
> The provided key must be comparable and should not be of type string or any other built-in type to avoid collisions between packages using context
Here is the example for getting and setting key/value in context
package main
import (
"context"
"log"
)
// You need to define a type to prevent the collision
type key int
const fooKey key = 1
const barKey key = 2
func main() {
ctx := context.Background()
m := map[key]string{
fooKey: "foo",
barKey: "bar",
}
// Add to context
for k, v := range m {
ctx = context.WithValue(ctx, k, v)
}
// Get value from context
for k := range m {
v := ctx.Value(k).(string)
log.Println("value is: ", v)
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论