Go语言学习笔记之反射用法详解语言学习笔记之反射用法详解
主要介绍了Go语言学习笔记之反射用法,详细分析了Go语言中反射的概念、使用方法与相关注意事项,需要的朋
友可以参考下
本文实例讲述了Go学习笔记之反射用法。分享给大家供大家参考,具体如下:
一、类型一、类型(Type)
反射(reflect)让我们能在运行期探知对象的类型信息和内存结构,这从一定程度上弥(mi)补了静态语言在动态行为上的不
足。同时,反射还是实现元编程的重要手段。
和 C 数据结构一样,Go 对象头部并没有类型指针,通过其自身是无法在运行期获知任何类型相关信息的。反射操作所需要的
全部信息都源自接口变量。接口变量除存储自身类型外,还会保存实际对象的类型数据。
func TypeOf(i interface{}) Type
func ValueOf(i interface{}) Value
这 两个 反射入口函数,会将任何传入的对象转换为接口类型。
在面对类型时,需要区分 Type 和 Kind。前者表示真实类型(静态类型),后者表示其基础结构(底层类型)类别 -- 基类型。
复制代码 代码如下:
type X int
func main() {
var a X = 100
t := reflect.TypeOf(a)
fmt.Println(t)
fmt.Println(t.Name(), t.Kind())
}
输出:
X int
所以在类型判断上,须选择正确的方式
复制代码 代码如下:
type X int
type Y int
func main() {
var a, b X = 100, 200
var c Y = 300
ta, tb, tc := reflect.TypeOf(a), reflect.TypeOf(b), reflect.TypeOf(c)
fmt.Println(ta == tb, ta == tc)
fmt.Println(ta.Kind() == tc.Kind())
}
除通过实际对象获取类型外,也可直接构造一些基础复合类型。
复制代码 代码如下:
func main() {
a := reflect.ArrayOf(10, reflect.TypeOf(byte(0)))
m := reflect.MapOf(reflect.TypeOf(""), reflect.TypeOf(0))
fmt.Println(a, m)
}
输出:
[10]uint8 map[string]int
传入对象 应区分 基类型 和 指针类型,因为它们并不属于同一类型。
复制代码 代码如下:
func main() {
x := 100
tx, tp := reflect.TypeOf(x), reflect.TypeOf(&x)
fmt.Println(tx, tp, tx == tp)
fmt.Println(tx.Kind(), tp.Kind())
fmt.Println(tx == tp.Elem())