场景
有如下代码:
ctx := context.WithValue(context.Background(), "k1", "v1")
ctxValue := reflect.ValueOf(ctx).Elem()
fieldValue := ctxValue.FieldByName("key")
fmt.Println(fieldValue.Interface())
运行后报错:
panic: reflect.Value.Interface: cannot return value obtained from unexported field or method [recovered]
panic: reflect.Value.Interface: cannot return value obtained from unexported field or method
解决
看报错信息得知, 因为字段是私有的, 所以不能够获取. 解决方法就是通过反射来将其安全性去掉:
ctx := context.WithValue(context.Background(), "k1", "v1")
ctxValue := reflect.ValueOf(ctx).Elem()
fieldValue := ctxValue.FieldByName("key")
// 直接获取地址信息
fieldValue = reflect.NewAt(fieldValue.Type(), unsafe.Pointer(fieldValue.UnsafeAddr())).Elem()
fmt.Println(fieldValue.Interface())