golang 反射

什么是反射?

维基百科中解释为:

反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力

通俗来讲就是, go 语言中提供一种机制,可以在代码运行时获取变量的类型和值,这种机制就是反射。有反射那么有“正射“么? “正射“就是我们一般用法:定义变量, 编译时就可以知道变量的类型和值。

反射如何使用

反射主要是reflect包提供,提供的类型和方法如下:
- 类型

 reflect.Value  : 表示具体值
 reflect.Type  :表示具体类型,如自己定义的 type  Test struct {}, Type 就是Test 
 reflect.Kind : 表示 特定类型,go中定义的类型 ,如自己定义的 type  Test struct {}, Kind 就是 struct 

- 方法

reflect.ValueOf() :返回 reflect.Value
reflect.TypeOf(): 返回 reflect.Type
reflect.Value.NumField(): 返回结构体中字段的数量
reflect.Value.Field(i int):返回字段 i 的 reflect.Value

一个例子

package main


import (
    "reflect"
    "fmt"
)

type Student struct {
    Name string
    Age  int
    Sex  string
}


func ReflectMethod(v interface{}) {

    vValue := reflect.ValueOf(v)
    num := vValue.NumField()
    for i := 0; i < num ; i ++ {
        switch vValue.Field(i).Kind() {
        case reflect.String :
            fmt.Printf("%s\n", vValue.Field(i))
        case reflect.Int :
            fmt.Printf("%d\n", vValue.Field(i) )
        }
    }


}


func main() {
    student := Student{
        "zhangsan",
        18,
        "male",
    }


    ReflectMethod(student)
}

输出:

zhangsan
18
male

反射的使用场景

适合的场景 : 写测试用例的时候可以使用反射
其他场景尽量不要使用反射,原因如下:
1. 业务代码中写反射,会增加复杂性,让人难以理解
2. 反射性能比较低,比正常代码要慢一到两个数量级
3. 反射并不能在编译时检查出错误,在运行时可能会出现panic
所以在正常代码中尽量不要使用反射。

参考

[1]《The Go Programming Language》中文版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值