希望你还能记得反射中的 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)相关推荐

  1. java 反射 速度_Java反射,但速度更快

    java 反射 速度 在编译时不知道Java类的最快方法是什么? Java框架通常会这样做. 很多. 它可以直接影响其性能. 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成. 用例 ...

  2. Java反射,但速度更快

    在编译时不知道Java类的最快方法是什么? Java框架通常会这样做. 很多. 它可以直接影响其性能. 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成. 用例 假设我们有一个简单的 ...

  3. Java 反射 (快速了解反射)

    反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  4. Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...

    ## 多态 ```python OOP中标准解释:多个不同类型对象,可以响应同一个方法,并产生不同结果,即为多态 多态好处:只要知道基类使用方法即可,不需要关心具体哪一个类的对象实现的,以不变应万变, ...

  5. [AutoMapper]反射自动注册AutoMapper Profile

    AutoMapper 帮我我们方便管理物件跟物件之间属性值格式转换 模型转换 这里有两个类别 UserInfoModel 当作我们从DB捞取出来模型资料 public class UserInfoMo ...

  6. 2022-2028年中国反射偏光膜行业市场研究及前瞻分析报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了反射偏光膜行业相关概述.中国反射偏光膜行业运行环境.分析了中国反射偏 ...

  7. Go 学习笔记(39)— Go 反射

    本文参考 http://c.biancheng.net/golang/reflect/ 反射是把双刃剑,功能强大但代码可读性并不理想,若非必要并不推荐使用反射. 1. 反射概念 反射是指在程序运行期对 ...

  8. PHP的Reflection反射机制

    原文地址: http://www.nowamagic.net/php/php_Reflection.php PHP5添加了一项新的功能:Reflection.这个功能使得程序员可以 reverse-e ...

  9. 需要反射时使用dynamic

    //使用dynamic的写法 dynamic fileExplorerData = _currentFolder.FileExplorerData; var data = fileExplorerDa ...

  10. c 与java 反射性能_谈谈Java 反射的快慢

    [相关学习推荐:java基础教程] 反射到底是好是坏 说到Java 中的反射,初学者在刚刚接触到反射的各种高级特性时,往往表示十分兴奋,甚至会在一些不需要使用反射的场景中强行使用反射来「炫技」.而经验 ...

最新文章

  1. Cocos-2d 坐标系
  2. es6笔记2之解构赋值,rest和展开运算符
  3. mysql合并表快速去重_MySQL数据表合并去重的简单实现方法
  4. 化工热力学重修补考第三章重点内容
  5. mysql联合查询结果_请问 MySQL 这个情况如何联合查询得到正确的结果?
  6. 一张图看懂小程序全生态
  7. 怎么用计算机计算出选手最后得分,WPS技巧:TRIMMEAN函数计算选手得分
  8. 小牛485通讯原理_让你秒懂智能电表工作原理及抄表原理
  9. sql---如何把sql查询出来的结果当做另一个sql的条件查询,1、语句2、with as
  10. Lightroom Classic 教程,如何在 Lightroom 中使用引导式修复透视图?
  11. HDOJ 1166 HDU 1166 敌兵布阵 ACM 1166 IN HDU
  12. arcgis利用Model Builder构建器进行批量处理数据
  13. QT窗口与Windows系统窗口之间关系和转换
  14. 常用正则表达式,持续更新
  15. 疯狂的 Web 应用开源项目
  16. 深度学习教程(15) | 自然语言处理与词嵌入(吴恩达·完整版)
  17. 机器学习(九)基于SVM的上证指数涨跌预测
  18. BIM模型文件下载——精装修样板间模型
  19. [附源码]计算机毕业设计springboot家庭医生签约服务管理系统
  20. (复习)基础算法--搜索--深入训练(USACO-Feb08、WOW模拟赛Day2-T4、USACO-Dec13、CTSC-1999)

热门文章

  1. 数据结构(C语言版)-- 数据结构基础
  2. 009_设备树属性的获取-以LED为例
  3. 美国卡内基梅隆大学计算机科学生源质量,卡内基梅隆大学2020新生数据,计算机学院录取率堪比藤校!...
  4. VM虚拟机win2003桥接模式本地连接受限制问题
  5. linaro软件源更新问题
  6. 学生综合素质评价系统c语言,学生综合素质评价表自我评价范文(2)
  7. 色彩知识的运用 和 色彩意境解析
  8. ubuntu 完整学习资料
  9. 全通系统定义、零极点关系、应用
  10. U盘 安装 WIN7 ISO