go反射无法获取私有字段的值

场景

有如下代码:

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())
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请发表评论。x