第12章,部分字词修订。

This commit is contained in:
zhliner
2017-08-24 22:31:28 +08:00
parent 560d22cccc
commit ed194fc3cf
4 changed files with 9 additions and 9 deletions
+2 -2
View File
@@ -25,7 +25,7 @@ fmt.Println(c.CanAddr()) // "false"
fmt.Println(d.CanAddr()) // "true"
```
每当我们通过指针间接地获取的reflect.Value都是可取地址的,即使开始的是一个不可取地址的Value。在反射机制中,所有关于是否支持取地址的规则都是类似的。例如,slice的索引表达式e[i]将隐式地包含一个指针,它就是可取地址的,即使开始的e表达式不支持也没有关系。以此类推,reflect.ValueOf(e).Index(i)对的值也是可取地址的,即使原始的reflect.ValueOf(e)不支持也没有关系。
每当我们通过指针间接地获取的reflect.Value都是可取地址的,即使开始的是一个不可取地址的Value。在反射机制中,所有关于是否支持取地址的规则都是类似的。例如,slice的索引表达式e[i]将隐式地包含一个指针,它就是可取地址的,即使开始的e表达式不支持也没有关系。以此类推,reflect.ValueOf(e).Index(i)对的值也是可取地址的,即使原始的reflect.ValueOf(e)不支持也没有关系。
要从变量对应的可取地址的reflect.Value来访问变量需要三个步骤。第一步是调用Addr()方法,它返回一个Value,里面保存了指向变量的指针。然后是在Value上调用Interface()方法,也就是返回一个interface{},里面包含指向变量的指针。最后,如果我们知道变量的类型,我们可以使用类型的断言机制将得到的interface{}类型的接口强制转为普通的类型指针。这样我们就可以通过这个普通指针来更新变量了:
@@ -37,7 +37,7 @@ px := d.Addr().Interface().(*int) // px := &x
fmt.Println(x) // "3"
```
或者,不使用指针,而是通过调用可取地址的reflect.Value的reflect.Value.Set方法来更新对的值:
或者,不使用指针,而是通过调用可取地址的reflect.Value的reflect.Value.Set方法来更新对的值:
```Go
d.Set(reflect.ValueOf(4))