当前位置: 首页 > news >正文

北京网站优化效果国外优秀的网站

北京网站优化效果,国外优秀的网站,wordpress 表前缀,国产搜什么关键词最好看在 go 语言中,实现反射能力的是 reflect包,能够让程序操作不同类型的对象。其中,在反射包中有两个非常重要的 类型和 函数,两个函数分别是: reflect.TypeOfreflect.ValueOf 两个类型是 reflect.Type 和 reflect.Value…

在 go 语言中,实现反射能力的是 reflect包,能够让程序操作不同类型的对象。其中,在反射包中有两个非常重要的 类型和 函数,两个函数分别是:

  • reflect.TypeOf
  • reflect.ValueOf
    两个类型是 reflect.Type 和 reflect.Value,它们与函数是一一对应的关系:

使用场景:map和struct的相互转化,json序列化,ORM框架,rpc服务的注册和调用
在这里插入图片描述

1 Type 和 TypeOf

reflect.Type 类型是一个接口类型,内部指定了若干方法,通过这些方法我们可以获取到反射类型的各种信息,例如:字段、方法等
使用 reflect.TypeOf() 函数可以获取将任意值的类型对象 (reflect.Type),程序通过类型对象可以访问任意值的类型信息

func main() {type MyInt inttype cat struct {Name stringType int `json:"type" id:"100"`}inst := cat{Name: "mimi", Type: 1}typeOfCat := reflect.TypeOf(inst)// 显示反射类型对象的名称和种类fmt.Println(typeOfCat.Name(), typeOfCat.Kind())for i := 0; i < typeOfCat.NumField(); i++ {// 获取每个成员的结构体字段类型fieldType := typeOfCat.Field(i)// 输出成员名和tagfmt.Printf("name: %v  tag: '%v'\n", fieldType.Name, fieldType.Tag)}// 通过字段名, 找到字段类型信息if catType, ok := typeOfCat.FieldByName("Type"); ok {// 从tag中取出需要的tagfmt.Println(catType.Tag.Get("json"), catType.Tag.Get("id"))}var Zero MyInt// 获取Zero常量的反射类型对象typeOfA := reflect.TypeOf(Zero)// 显示反射类型对象的名称和种类fmt.Println(typeOfA.Name(), typeOfA.Kind())
}

2 Value 和 ValueOf

reflect.Value 类型是一个结构体,封装了反射对象的值,内部若干方法,可以通过这些方法来获取和修改对象的值,使用 reflect.ValueOf 函数可以返回 Value 类型,value 类型还可以生成原始类型对象

反射值对象(reflect.Value)提供对结构体访问的方法,通过这些方法可以完成对结构体任意值的访问,方法列表参考 Type 常用方法
修改成员的值 使用 reflect.Value 对包装的值进行修改时,需要遵循一些规则。如果该对象不可寻址或者成员是私有的,则无法修改对象值

func main() {type dog struct {LegCount intage int}// 获取dog实例地址的反射值对象valueOfDog := reflect.ValueOf(&dog{})// 取出dog实例地址的元素valueOfDog = valueOfDog.Elem()// 获取legCount字段的值vLegCount := valueOfDog.FieldByName("LegCount")vAge := valueOfDog.FieldByName("age")// 尝试设置legCount的值vLegCount.SetInt(4)// 这里会报错vAge.SetInt(4)fmt.Println(vLegCount.Int())
}

3 通过反射调用函数

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

package main
import ("fmt""reflect"
)
// 普通函数
func add(a, b int) int {return a + b
}
func main() {// 将函数包装为反射值对象funcValue := reflect.ValueOf(add)// 构造函数参数, 传入两个整型值paramList := []reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)}// 反射调用函数retList := funcValue.Call(paramList)// 获取第一个返回值, 取整数值fmt.Println(retList[0].Int())
}

4 反射性能

通过反射生成对象和字段赋值都会影响性能,但是通过反射的确确确实实能简化代码,为业务逻辑提供统一的代码, 比如标准库中json的编解码、rpc服务的注册和调用, 一些ORM框架比如gorm等,都是通过反射处理数据的,这是为了能处理通用的类型。

http://www.yayakq.cn/news/463685/

相关文章:

  • 网站推广在哪些平台做外链wordpress分页
  • 律师做网站有用海南新闻在线观看
  • 网站导航栏特效360建筑网中级机械工程师招聘
  • 如何在网站申请做co中兴通讯的网站建设分析
  • 网站建设外文参考文献深圳网站优化平台
  • 广州做网站的公司哪家好云服务器网站解析
  • 新网站制作市场wordpress app
  • 网站快照前显示中文怎么做的手机下载app并安装
  • 成都淮洲新城建设投资有限公司网站创建wordpress主题
  • 吴忠市住房和城乡建设局网站南沙建设网站
  • 官方网站建设 招标公告网站建设廉政风险点
  • 家居企业网站建设如何大型大型网站建设方案ppt
  • 做网站域名的成本网站建设冖金手指花总十五
  • 网站开发中的文档手机客户端网站怎么做
  • 怎么做网站教程中国视觉设计网
  • 陕西建设监理协会网站全国职业生涯规划大赛
  • 长沙专业网站建设公司排名制作一个网站平台吗
  • 上海做网站公司排名镇江公司网站建设
  • 如何做一个商城类型的网站郑州网站建设公司锐客科技
  • 做海外网站ppt模板有哪些网站
  • 河北省建设工程招投标管理网站网页版游戏网站
  • 海口个人建站模板wordpress的polylang
  • 做决定网站网站升级的内容包括哪些
  • 个人网站asp源码宁波企业网站搭建价格
  • 手机网站 焦点图企业查询天眼查入口
  • 东莞制作网站合肥企业网站建设工
  • 做外贸网站违法吗网站设计与开发的基本步骤包括哪些?
  • 学校网站手机站的建设萍乡市建设局网站王丽
  • 做动效很好的网站扬州市城乡建设局网站首页
  • 用nas做网站做网站有哪些技术