081-反射(Kind)
希望你还能记得反射中的 Type 和 Value 这两个类型。Type 是接口类型,Value 是 Struct 类型;Type 是类型描述,而 Value 是具体的值。
这次,我们来看一下 Golang 反射中的另一个重要概念 —— Kind.
1. Kind 定义
A Kind represents the specific kind of type that a Type represents. The zero Kind is not a valid kind.
Kind 的官方定义如上,它描述的是 Type 被归属于哪一类。在 Golang 里,所有 Type 都能归属到下面这些类别:
type Kind uintconst (Invalid Kind = iotaBoolIntInt8Int16Int32Int64UintUint8Uint16Uint32Uint64UintptrFloat32Float64Complex64Complex128ArrayChanFuncInterfaceMapPtrSliceStringStructUnsafePointer
)
举几个例子:
bool // Kind: Bool
int8 // Kind: Int8
type Person struct{ Name string, Age int8} // Kind: Struct
type Second uint64 // Kind: Uint64
type Reader interface{ Read(b byte[]) (int, error) } // Kind: Interface
上面这几个类型,总是能被划分到一个类别。
2. 判断 Kind
Type 和 Value 类型都提供了 Kind 方法,来返回其类型的类别。
// Type 中的 Kind 方法
type Type interface {...Kind() Kind...
}// Value 中的 Kind 方法
type Value Struct {...
}
func (v Value) Kind() Kind
在上一节我们就已经学会了如果通过变量来获取 Type 和 Value 对象。下面我们利用 Type 或 Value 来获取 Type 的 Kind 类别。
package mainimport ("fmt""reflect"
)type Second int
type Person struct {Name stringAge int
}func main() {fmt.Println("var s Second") // var s Secondvar s Second = 100t := reflect.TypeOf(s)fmt.Printf("s.Type.String: %v\n", t.String()) // s.Type.String: main.Secondfmt.Printf("s.Type: %v\n", t) // s.Type: main.Secondk := t.Kind()fmt.Printf("s.Type.kind: %d:%v\n", k, k) // s.Type.kind: 2:intfmt.Println()v := reflect.ValueOf(s)fmt.Printf("s.Value.String: %v\n", v.String()) // s.Value.String: <main.Second Value>fmt.Printf("s.Value: %v\n", v) // s.Value: 100fmt.Println()k = v.Kind()fmt.Printf("s.Value.Kind: %d:%v\n", k, k) // s.Value.Kind: 2:intfmt.Println()fmt.Println(`var p = Person{"allen", 19}`) // var p = Person{"allen", 19}var p = Person{"allen", 19}t = reflect.TypeOf(p)fmt.Printf("p.Type.String): %v\n", t.String()) // p.Type.String): main.Personfmt.Printf("p.Type: %v\n", t) // p.Type: main.Personk = t.Kind()fmt.Printf("p.Type.kind: %d:%v\n", k, k) // p.Type.kind: 25:structfmt.Println()v = reflect.ValueOf(p)fmt.Printf("p.Value.String: %v\n", v.String()) // p.Value.String: <main.Person Value>fmt.Printf("p.Value: %v\n", v) // p.Value: {allen 19}fmt.Println()k = v.Kind()// 注意变量 p 的 Kind,按照 %d 打印出来的是 25,因为 struct 正好对应 25。fmt.Printf("p.Value.Kind: %d:%v\n", k, k) // s.Value.Kind: 25:structfmt.Println()
}
3. 总结
- 掌握 Kind 的定义
- 知道常见的 Kind 有哪些
知道了判断某个类型的 Kind 以后,一切就好办了,如果是数值类型,我们可以直接使用 %d
或 %f
将其格式化,如果是 Struct 类型,我们可以枚举出这个 Struct 所有的字段名,以及字段名对应的值。
081-反射(Kind)相关推荐
- java 反射 速度_Java反射,但速度更快
java 反射 速度 在编译时不知道Java类的最快方法是什么? Java框架通常会这样做. 很多. 它可以直接影响其性能. 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成. 用例 ...
- Java反射,但速度更快
在编译时不知道Java类的最快方法是什么? Java框架通常会这样做. 很多. 它可以直接影响其性能. 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成. 用例 假设我们有一个简单的 ...
- Java 反射 (快速了解反射)
反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...
- Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...
## 多态 ```python OOP中标准解释:多个不同类型对象,可以响应同一个方法,并产生不同结果,即为多态 多态好处:只要知道基类使用方法即可,不需要关心具体哪一个类的对象实现的,以不变应万变, ...
- [AutoMapper]反射自动注册AutoMapper Profile
AutoMapper 帮我我们方便管理物件跟物件之间属性值格式转换 模型转换 这里有两个类别 UserInfoModel 当作我们从DB捞取出来模型资料 public class UserInfoMo ...
- 2022-2028年中国反射偏光膜行业市场研究及前瞻分析报告
[报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了反射偏光膜行业相关概述.中国反射偏光膜行业运行环境.分析了中国反射偏 ...
- Go 学习笔记(39)— Go 反射
本文参考 http://c.biancheng.net/golang/reflect/ 反射是把双刃剑,功能强大但代码可读性并不理想,若非必要并不推荐使用反射. 1. 反射概念 反射是指在程序运行期对 ...
- PHP的Reflection反射机制
原文地址: http://www.nowamagic.net/php/php_Reflection.php PHP5添加了一项新的功能:Reflection.这个功能使得程序员可以 reverse-e ...
- 需要反射时使用dynamic
//使用dynamic的写法 dynamic fileExplorerData = _currentFolder.FileExplorerData; var data = fileExplorerDa ...
- c 与java 反射性能_谈谈Java 反射的快慢
[相关学习推荐:java基础教程] 反射到底是好是坏 说到Java 中的反射,初学者在刚刚接触到反射的各种高级特性时,往往表示十分兴奋,甚至会在一些不需要使用反射的场景中强行使用反射来「炫技」.而经验 ...
最新文章
- Cocos-2d 坐标系
- es6笔记2之解构赋值,rest和展开运算符
- mysql合并表快速去重_MySQL数据表合并去重的简单实现方法
- 化工热力学重修补考第三章重点内容
- mysql联合查询结果_请问 MySQL 这个情况如何联合查询得到正确的结果?
- 一张图看懂小程序全生态
- 怎么用计算机计算出选手最后得分,WPS技巧:TRIMMEAN函数计算选手得分
- 小牛485通讯原理_让你秒懂智能电表工作原理及抄表原理
- sql---如何把sql查询出来的结果当做另一个sql的条件查询,1、语句2、with as
- Lightroom Classic 教程,如何在 Lightroom 中使用引导式修复透视图?
- HDOJ 1166 HDU 1166 敌兵布阵 ACM 1166 IN HDU
- arcgis利用Model Builder构建器进行批量处理数据
- QT窗口与Windows系统窗口之间关系和转换
- 常用正则表达式,持续更新
- 疯狂的 Web 应用开源项目
- 深度学习教程(15) | 自然语言处理与词嵌入(吴恩达·完整版)
- 机器学习(九)基于SVM的上证指数涨跌预测
- BIM模型文件下载——精装修样板间模型
- [附源码]计算机毕业设计springboot家庭医生签约服务管理系统
- (复习)基础算法--搜索--深入训练(USACO-Feb08、WOW模拟赛Day2-T4、USACO-Dec13、CTSC-1999)