Go语言中反射的正确使用
作者:daisy 发布时间:2024-02-01 16:31:57
标签:go语言,反射
介绍
反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是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
总结
0
投稿
猜你喜欢
- click() 对象.click() 使对象被点击。 closed 对象.closed 对象窗口是否已关闭true/false clearT
- 本文研究Keras自带的几个常用的Loss Function。1. categorical_crossentropy VS. sparse_
- 前言之前在进行深度学习训练的时候,偶然发现使用PIL读取图片训练的效果要比使用python-opencv读取出来训练的效果稍好一些,也就是训
- 在家无聊,线代和高数看不懂,整点事情干,就准备预定回学校的高铁票,于是就有了这个文章准备工作1.pip安装chromediver,当然也可以
- 本文实例讲述了Python从MP3文件获取id3的方法。分享给大家供大家参考。具体如下:def getID3(filename): &nbs
- 首先祝贺Echarts顺利的从Apache毕业,多了个响亮的名字:Apache ECharts,现在的官网地址在这里:传送门,首页相当的国际
- Python中遍历列表有以下几种方法:一、for循环遍历lists = ["m1", 1900, "m2&qu
- docs = [‘icassp improved human face identification using frequency dom
- 前言为了机器人在寻路的过程中避障并且找到最短距离,我们需要使用一些算法进行路径规划(Path Planning),常用的算法有Djikstr
- 事实上各式Tooltips方法非常多. 不过大部分都是用Javascript实现.例如ikshow.cn, 使用的JavaScript, D
- 本文实例讲述了javascript实现Table排序的方法。分享给大家供大家参考。具体实现方法如下:<!DOCTYPE html PU
- Python 3中的File对象不支持next()方法。 Python 3有一个内置函数next(),它通过调用其next ()方法从迭代器
- 取反运算符的原理:1.对3取反:(取4位二进制)①化为二进制:3→0011②对二进制结果取反:0011→1100③对结果先取反再加1:110
- 本文介绍,在 VSCode 使用 IPython Kernel的设置方法,详细介绍如下所示:要达到的效果:只需按下 Ctrl+;,选中的几行
- 1、汉语分词的由来使用ASP开发的中小企业的网站,对于站内搜索,往往只是简单的通过SQL语句匹配数据库。对于比较短的词语搜索,这个方法是有效
- 一、前言 说实话,刚测试ES的时候,我的内心是崩溃的,好多单词都不知道
- 网上学习的时候总会遇到一些好的文章,分享给大家,也谢谢作者的分享。Python 简介Python 是一个高层次的结合了解释性、编译性、互动性
- 优化数据库的注意事项:1、关键字段建立索引。2、使用存储过程,它使SQL变得更加灵活和高效。3、备份数据库和清除垃圾数据。4、SQL语句语法
- 目录Uiautomator2的安装和使用具体实现如何打开支付宝并进入蚂蚁森林?收能量如何停止完整代码结语@[toc] 虽然我支付宝加了好多好
- 需要准备的工具:SQL Query Analyzer和SqlExec Sunx Version第一部分:去掉xp_cmdshell保护系统的