第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

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))