面试题
一、选择题
1.Golang支持反射,反射最常见的使用场景是做对象的序列化,这句话是否正确()
A.正确
B.错误
答案:A
二、简答题
1.Go的反射包怎么找到对应的方法
v := reflect.ValueOf(&person) // 注意一定是指针
v2 := v.MethodByName("Get1")
// 调用
v2.Call([]reflect.Value{})
2.分别说说typeOf和valueOf
TypeOf() 函数返回一个接口,这个接口定义了一系列方法,利用这些方法可以获取关于类型的所有信息; ValueOf() 函数返回一个结构体变量,包含类型信息以及实际值。
3.说说反射的使用场景
1.做对象的序列化,构建适用于不同类型的工具
2.序列化和反序列化,比如json, protobuf等各种数据协议
3.各种数据库的ORM,比如gorm,sqlx等数据库中间件
4.配置文件解析相关的库,比如yaml、ini等
5.编写一个函数,但是并不知道传给你的参数类型是什么
6.需要根据某些条件决定调用哪个函数,调用的函数是字符串参数
4.如何获取结构体中的tag标签?
t := reflect.TypeOf(&student) // 注意使用指针
field0 := t.Elem().Field(0)
fmt.Printf("tag json=%s\n", field0.Tag.Get("json"))
5.反射中,typeOf返回的Type接口,有关method的都有什么方法?
// 返回类型方法集里的第 `i` (传入的参数)个方法
Method(int) Method
// 通过名称获取方法
MethodByName(string) (Method, bool)
// 获取类型方法集里导出的方法个数
NumMethod() int
6.反射中,typeOf返回的Type接口,有关field的都有什么方法?
7.反射中,typeOf返回的Type接口,Elem函数有什么作用?
// 返回内部子元素类型,只能由类型 Array, Chan, Map, Ptr, or Slice 调用
Elem() Type
举例:
func SetValue(age int) {
value_age := reflect.ValueOf(&age) //这里必须使用指针的方式
fmt.Println(value_age.Type()) // *int的赋值:*age = 4
value_age.Elem().SetInt(4) // Elem returns a type's element type.
fmt.Printf("After set x is %v\n",age)
}