知识卡片

可设置性来自地址

普通读书笔记卡 · 1479.a

内容

反射修改值要求拿到可寻址、可设置的对象。传值只能观察副本,传指针再 Elem 才能改原对象;这和 Go 的值语义保持一致。

参考来源

- 位置:《Go语言底层原理剖析》第13章《反射高级编程》13.2.4节《修改反射的值》 - 结论依据:原文说明"只有当反射中存储的实际值是指针时才能赋值,否则是没有意义的,因为在反射之前,实际值被转换为了空接口,如果空接口中存储的值是一个副本,那么修改它会引起混淆,因此Go语言禁止这样做",并给出 CanSet 方法用于判断反射值是否可赋值,因此可以推出"反射修改值要求拿到可寻址、可设置的指针对象"的结论。 - 原始内容:有多种方式可以修改反射中存储的值,例如reflect.Value的Set方法……只有当反射中存储的实际值是指针时才能赋值,否则是没有意义的,因为在反射之前,实际值被转换为了空接口,如果空接口中存储的值是一个副本,那么修改它会引起混淆,因此Go语言禁止这样做。这和第12章提到的禁止用值类型去调用指针接收者的方法的原理是一样的。为了避免这种错误,reflect.value提供了CanSet方法用于获取当前的反射值是否可以赋值。