介绍
反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。
反射有两个问题,在使用前需要三思:
- 大量的使用反射会损失一定性能
- Clear is better than clever. Reflection is never clear.
Go的类型设计上有一些基本原则,理解这些基本原则会有助于你理解反射的本质:
- 变量包括 <type, value> 两部分。理解这一点你就知道为什么
nil != nil
了。
- type包括
static type
和concrete type
. 简单来说static type
是你在编码是看见的类型,concrete type
是runtime系统看见的类型。
- 类型断言能否成功,取决于变量的
concrete type
,而不是static type
. 因此,一个 reader变量如果它的concrete type也实现了write方法的话,它也可以被类型断言为writer.
- Go中的反射依靠
interface{}
作为桥梁,因此遵循原则3. 例如,反射包.Kind方法返回的是concrete type
, 而不是static type
.
多说无用,下面来看示例代码
复制代码 代码如下:
package main
import (
"fmt"
"reflect"
)
type T struct {
A int
B string
}
func main() {
t := T{23, "skidoo"}
tt := reflect.TypeOf(t)
fmt.Printf("t type:%v\n", tt)
ttp := reflect.TypeOf(&t)
fmt.Printf("t type:%v\n", ttp)
// 要设置t的值,需要传入t的地址,而不是t的拷贝。
// reflect.ValueOf(&t)只是一个地址的值,不是settable, 通过.Elem()解引用获取t本身的reflect.Value
s := reflect.ValueOf(&t).Elem()
typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
fmt.Printf("%d: %s %s = %v\n", i,
typeOfT.Field(i).Name, f.Type(), f.Interface())
}
}
// 输出结果
// t type:main.T
// t type:*main.T
// 0: A int = 23
// 1: B string = skidoo
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 群星《情歌最毒4CD》24K德国HD金碟[WAV分轨][2.4G]
- 《字符战场生存之战》特色玩法介绍
- 《七龙珠电光炸裂zero》派生连招之突击按键
- 《暗喻幻想》顺风耳作用介绍
- 崔健1985-梦中的倾诉[再版][WAV+CUE]
- 黄子馨《追星Xin的恋人们2》HQ头版限量编号[WAV+CUE]
- 孟庭苇《情人的眼泪》开盘母带[低速原抓WAV+CUE]
- 孙露《谁为我停留HQCD》[低速原抓WAV+CUE][1.1G]
- 孙悦《时光音乐会》纯银CD[低速原抓WAV+CUE][1.1G]
- 任然《渐晚》[FLAC/分轨][72.32MB]
- 英雄联盟新英雄安蓓萨上线了吗 新英雄安蓓萨技能介绍
- 魔兽世界奥杜尔竞速赛什么时候开启 奥杜尔竞速赛开启时间介绍
- 无畏契约CGRS准星代码多少 CGRS准星代码分享一览
- 张靓颖.2012-倾听【少城时代】【WAV+CUE】
- 游鸿明.1999-五月的雪【大宇国际】【WAV+CUE】