从零学习 Go 语言(36):图解反射三大定律,so easy

2020-07-09 00:00:00 变量 对象 接口 类型 反射

很多人都知道我是从 Python 转过来学习 Go 语言的,当我在使用 Python 的时候,我甚至可以做到不需要知道什么是内省,什么是反射,就可以立即使用内省去做一些事情。

而在学习 Go 语言后,反射在我这却变成了一个难点,一直感觉这个 反射对象 的概念异常的抽象。

这篇文章还是会跟上篇文章一样,尽量使用图解来解释一些抽象的概念,如果是我理解有误,还希望你在文章尾部给我留言指正,谢谢。

关于反射的内容,我分为了好几篇,这一篇是入门篇,会从经典的反射三大定律入手,写一些 demo 代码,告诉你反射的基本内容。

1. 真实世界与反射世界

在本篇文章里,为了区分反射前后的变量值类型,我将反射前环境称为 真实世界,而将反射后的环境称为 反射世界。这种比喻不严谨,但是对于我理解是有帮助的,也希望对你有用。

在反射的世界里,我们拥有了获取一个对象的类型,属性及方法的能力。



2. 两种类型:Type 和 Value

在 Go 反射的世界里,有两种类型非常重要,是整个反射的核心,在学习 reflect 包的使用时,先得学习下这两种类型:

  1. reflect.Type
  2. reflect.Value

它们分别对应着真实世界里的 type 和 value,只不过在反射对象里,它们拥有更多的内容。

从源码上来看,reflect.Type 是以一个接口的形式存在的

type Type interface {
    Align() int
    FieldAlign() int
    Method(int) Method
    MethodByName(string) (Method, bool)
    NumMethod() int
    Name() string
    PkgPath() string
    Size() uintptr
    String() string
    Kind() Kind
    Implements(u Type) bool
    AssignableTo(u Type) bool
    ConvertibleTo(u Type) bool
    Comparable() bool
    Bits() int
    ChanDir() ChanDir
    IsVariadic() bool
    Elem() Type
    Field(i int) StructField
    FieldByIndex(index []int) StructField
    FieldByName(name string) (StructField, bool)
    FieldByNameFunc(match func(string) bool) (StructField, bool)
    In(i int) Type
    Key() Type
    Len() int
    NumField() int
    NumIn() int
    NumOut() int
    Out(i int) Type
    common() *rtype
    uncommon() *uncommonType
}

相关文章