反射

反射,能够在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,而不需要在编译时就知道这些变量的具体类型。反射也可以让我们将类型本身作为第一类的值类型处理。反射是一个复杂的内省技术,不应该随意使用。

反射是由 reflect 包提供的。 它定义了两个重要的类型, Type 和 Value。

一个 Type 表示一个Go类型. 它是一个接口, reflect.TypeOf 返回的是一个动态类型的接口值, 它总是返回具体的类型。

函数 reflect.TypeOf 接受任意的 interface{} 类型, 并以reflect.Type形式返回其动态类型:

t := reflect.TypeOf(3)  // a reflect.Type
fmt.Println(t.String()) // "int"
fmt.Println(t)          // "int"