走进迈莫

面试官问我go反射 我怀疑他要给我60k

2021-01-26  本文已影响0人  迈莫coding

目录

go发射第一弹【typeOf使用】
链接:https://mp.weixin.qq.com/s/F8yZyqC5UwoewsX0THqy1w

go反射第二弹【valuef使用】
链接:https://mp.weixin.qq.com/s/lgZykTL8ls6aG0OMNSbZMw

isNil()/isValid()

go语言中,通过 reflect.ValueOf() 方法获取 reflect.Value 对象时,在reflect.Value 对象中提供了一些方法用来判断值是否为空,如下表所示:

示例

package main
import (
   "fmt"
   "reflect"
)
type User struct{
   Name string
   Age int
}
func main(){
   user := &User{
      Name : "迈莫coding",
   }
   values := reflect.ValueOf(user)
   fmt.Println("user对象是否为空:", values.IsNil())
   values = values.Elem()
   fmt.Println("Name字段属性是否存在:",           values.FieldByName("Name").IsValid())
}

结果:

user对象是否为空: false
Name字段属性是否存在: true

代码说明:

- 第11行:实例化User对象
- 第15行:判断反射对象values是否为空
- 第17行:判断反射对象中"Name"字段属性是否有效

反射创建对象

在go语言中,若已知 reflect.Type 类型时,可以通过 reflect.New() 方法进行反射创建实例,但参数注意的是,只能传入 reflect.Type 类型对象。

示例

package main

import (
  "fmt"
  "reflect"
)

type User struct{
   Name string
}
func main() {
   types := reflect.TypeOf(&User{})
   values := reflect.New(types)
fmt.Println("反射创建出对象的类型和种类:", values.Type(), values.Kind())
}

结果

反射创建出对象的类型和种类: **main.User ptr

Call()函数

如果反射值对象(reflect.Value)中值的类型为函数时,可以通过 reflect.Value 调用该函数。使用反射调用函数时,需要将参数使用反射值对象的切片 []reflect.Value 构造后传入 Call() 方法中,调用完成时,函数的返回值通过 []reflect.Value 返回。

示例

package main

import (
  "fmt"
  "import"
)

func add(x, y int) int {
  return x + y 
}

func main() {
  addValue := reflect.ValueOf(add)
   // 构造函数参数, 传入两个整型值
    paramList := []reflect.Value{reflect.ValueOf(10),   reflect.ValueOf(20)}
    // 反射调用函数
    retList := funcValue.Call(paramList)
    // 获取第一个返回值, 取整数值
    fmt.Println(retList[0].Int())
}

代码说明如下:

第 9~12 行:定义一个普通的加法函数。
第 17 行:将 add 函数包装为反射值对象。
第 20 行:将 10 和 20 两个整型值使用 reflect.ValueOf 包装为 reflect.Value,再将反射值对象的切片 []reflect.Value 作为函数的参数。
第 23 行:使用 funcValue 函数值对象的 Call() 方法,传入参数列表 paramList 调用 add() 函数。
第 26 行:调用成功后,通过 retList[0] 取返回值的第一个参数,使用 Int 取返回值的整数值。

提示

反射调用函数的过程需要构造大量的 reflect.Value 和中间变量,对函数参数值进行逐一检查,还需要将调用参数复制到调用函数的参数内存中。调用完毕后,还需要将返回值转换为 reflect.Value,用户还需要从中取出调用值。因此,反射调用函数的性能问题尤为突出,不建议大量使用反射函数调用。

闲聊

文章也会持续更新,可以微信搜索「 迈莫coding 」第一时间阅读。

上一篇下一篇

猜你喜欢

热点阅读