Go 语言 提供了一种机制在运行时更新 变量 和检查它们的值、调用它们的 方法 和它们支持的内在操作,但是在编译时并不知道这些变量的具体 类型。这种机制被称为 反射。反射也可以让我们将类型本身作为第一类的值类型处理。
反射是把双刃剑,功能强大但代码可读性并不理想。若非必要,并不推荐使用反射。
Go 语言中的反射与其他语言有比较大的不同,Golang 中的发射主要涉及到两个基本概念 Type 和 Value,它们也是 Go 语言包中 reflect 包 里最重要的两个类型。
在 Golang 中对所有 接口 进行反射,都可以得到一个包含 Type 和 Value 的信息结构。顾名思义,Type 主要表达的是被反射的这个变量本身的类型信息,而 Value 则为该变量实例本身的信息。
Golang 中的反射主要有两个作用,即,获取类型信息和获取值类型。
reflect.TypeOf(x)
参数 | 描述 |
---|---|
x | 要获取类型的变量。 |
我们可以通过 reflect.TypeOf(x)
函数,获取变量的数据类型。
可以使用反射获取基本数据类型信息
package main
import (
"fmt"
"reflect"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
var x = 3.4
var str = "HaiCoder"
fmt.Println("x type =", reflect.TypeOf(x))
fmt.Println("str type =", reflect.TypeOf(str))
}
程序运行后,控制台输出如下:
首先,我们定义了一个 float 类型 的变量 x 和一个 字符串 类型的变量 str,接着,我们使用 reflect.TypeOf
获取这两个变量的类型,并打印。
即,我们使用 reflect.TypeOf
反射出了两个基本数据类型的变量的类型。
可以使用反射获取结构体类型信息
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
person := &Person{
Name:"HaiCoder",
Age:18,
}
fmt.Println("person type =", reflect.TypeOf(person))
}
程序运行后,控制台输出如下:
首先,我们定义了一个 结构体 Person,该结构体包含两个字段,即 Name 和 Age。接着,在 main 函数,我们定义了一个结构体类型的变量 person。
最后,我们使用反射获取结构体变量 person 的数据类型,并打印。
Go 语言中的反射与其他语言有比较大的不同,Golang 中的发射主要涉及到两个基本概念 Type 和 Value,它们也是 Go 语言包中 reflect 包里最重要的两个类型。Golang 反射获取数据类型语法:
reflect.TypeOf(x)