Loading

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())
posted @ 2022-11-23 16:39  烟草的香味  阅读(407)  评论(0编辑  收藏  举报