mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-11-21 18:43:17 +00:00
第12章,部分字词修订。
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user