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

佛山网页设计师培训长沙关键词优化公司电话

佛山网页设计师培训,长沙关键词优化公司电话,北京环球影城必须存包的项目,关于政府门户网站建设的见解文章目录 获取类型和值获取属性的类型和值通过反射修改值获取方法的名称和类型调用方法反射的缺点 获取类型和值 之前讲过接口nil不一定等于空接口,因为一个 interface 底层 由 type value 构成,只有 type 和 value 都匹配,才能 reflect.Vl…

文章目录

    • 获取类型和值
    • 获取属性的类型和值
    • 通过反射修改值
    • 获取方法的名称和类型
    • 调用方法
    • 反射的缺点

获取类型和值

  • 之前讲过接口nil不一定等于空接口,因为一个 interface 底层 由 type + value 构成,只有 typevalue 都匹配,才能 ==
  • reflect.VlaueOf 就是用来获取具体的 reflect.Value
  • reflect.TypeOf 用来获取具体的 reflect.Type
func main() {var (a *Ab interface{})fmt.Println(a)if b == nil {fmt.Println("b is nil")}fmt.Println(reflect.TypeOf(b), reflect.ValueOf(b))fmt.Println(reflect.TypeOf(a), reflect.ValueOf(a))b = aif b == nil {fmt.Println("b is nil")} else {fmt.Printf("current b is %v \n", b)fmt.Println("b not eq nil")}fmt.Println(reflect.TypeOf(b), reflect.ValueOf(b))
}

image.png
上面的代码说明了,刚开始的空接口 == nil,后来的接口为啥不等于 nil,因为 type变了,虽然value 还是 nil

获取属性的类型和值

  • 通过 reflect.Value 或者 reflect.TypeNumField 获取属性数量
  • 通过 reflect.TypeField 方法 获取属性相关信息
  • 通过 reflect.ValueField 方法 获取值相关信息
package mainimport ("fmt""reflect"
)type A struct {Name stringAge  int
}func main() {var a AgetType := reflect.TypeOf(a)getValue := reflect.ValueOf(a)fmt.Println("field num", getType.NumField())for i := 0; i < getType.NumField(); i++ {field := getType.Field(i)value := getValue.Field(i)fmt.Println("field name is", field.Name, "field value is", value.Interface())}
}

image.png

通过反射修改值

  • 通过获取value的反射对象即可,reflect.ValueOf 传入的必须是指针类型,只有原始反射对象可以进行修改,可以通过 reflect.ValueElem 方法取得
  • 通过 reflect.ValueCanset 方法来判断是否可以设置
  • 通过 Set... 系列方法来设置具体类型的值
package mainimport ("fmt""reflect"
)type A struct {Name stringAge  int
}func main() {a := A{Name: "old name",}valueOfA := reflect.ValueOf(&a).Elem()nameField := valueOfA.Field(0)if nameField.CanSet() {nameField.SetString("new name")} else {fmt.Println("don't set")}fmt.Println("new value", a.Name)
}
  • 因为调用 set... 设置值,需要知道类型,可以通过 reflect.Typekind 方法获取原始类型
    • 再通过 switch 去匹配类型来调用具体的 set... 方法
package mainimport ("fmt""reflect"
)type A struct {Name stringAge  int
}func main() {a := A{Name: "old name",}fmt.Println("old value", a.Name)valueOfA := reflect.ValueOf(&a).Elem()getType := reflect.TypeOf(a)field := getType.Field(0)nameField := valueOfA.Field(0)if nameField.CanSet() {switch field.Type.Kind() {case reflect.String:fmt.Println("string")nameField.SetString("new value")}} else {fmt.Println("don't set")}fmt.Println("new value", a.Name)
}

image.png

获取方法的名称和类型

  • 先通过 reflect.TypeNumMethod 方法获取方法数量
  • 在通过 reflect.TypeMethod 方法获取到具体的方法信息 reflect.Method
package mainimport ("fmt""reflect"
)type A struct {Name stringAge  int
}func (receiver *A) SetName(name string) {receiver.Name = name
}func (receiver *A) SetAge(age int) {receiver.Age = age
}func main() {var a A//有方法是依赖指针的所以需要传指针getType := reflect.TypeOf(&a)num := getType.NumMethod()for i := 0; i < num; i++ {method := getType.Method(i)fmt.Println("method name:", method.Name, "method type:", method.Type)}
}

image.png

调用方法

  • 通过 reflect.MethodCall 方法即可调用反射对象的方法
    • Call 中 接收的参数为 reflect.Value 的切片
    • 如果反射对象的方法不需要参数,传一个 reflect.Value 的空切片即可
    • 如果反射对象需参数,那么需要由反射对像参数的 reflect.Value 组成切片,传入 Call 完成调用
package mainimport ("fmt""reflect"
)type A struct {Name stringAge  int
}type Body struct {Like stringDesc string
}func (a A) Pr() {fmt.Println("A pr")
}func (a A) Talk(b Body) {fmt.Printf("Like:%s,Desc:%s", b.Like, b.Desc)
}func main() {var a AgetType := reflect.ValueOf(a)pr := getType.Method(0)//不需要参数pr.Call([]reflect.Value{})b := Body{Like: "i'm like",Desc: "i'm desc",}talk := getType.Method(1)//Talk 需要传入 Body struct, 所以反射调用,需要传入 由 Body的 reflect.Value 组成切片参数talk.Call([]reflect.Value{reflect.ValueOf(b),})
}

image.png

反射的缺点

  • 反射慢
    • 不管什么编程语言,反射都慢
    • 反射实现里有对 reflect.kind 大量的枚举 + 类型转换 等操作
    • reflect.Value 不能复用,每次都是返回一个新的值,其中 typ 还是指针类型,涉及对指针的频繁分配,GC

image.png
image.png
image.png

http://www.hrbkazy.com/news/16683.html

相关文章:

  • 有哪些网站可以做问卷调查搜索大全浏览器
  • ps个人网站首页怎么制作seo优化网站查询
  • 网络网站建设10大指标湖南官网网站推广软件
  • 做app网站的软件有哪些内容分销平台
  • 河南郑州网站建设哪家公司好qq群推广网站免费
  • 黑龙江做网站的公司seo免费课程视频
  • 牛商营销型网站建设方案山东seo优化
  • 网站官方认证怎么做百度搜题在线使用
  • 如何快速提高网站排名爱站网 关键词挖掘工具
  • etsy网站营销推广方式都有哪些
  • 重庆微信网站制作注册一个域名需要多少钱
  • 慈溪网站制作哪家最好搜索引擎广告投放
  • 建设银行注册网站名咋设置今天的新闻 最新消息
  • 开发工具里的选项都是灰色的淘宝seo关键词的获取方法有哪些
  • 做教程网站如何查用户搜索app 推广
  • 阿里云上可以做网站吗今日头条站长平台
  • 怎么做网站和服务器吗社群营销策略有哪些
  • 做本地的门户网站百度指数查询手机版app
  • 郑州东区网站建设百度搜首页
  • 营销型企业网站开发什么是营销渠道
  • 企业网站制作设计网络公司推广方案
  • 建个视频网站多少钱百度竞价排名价格
  • 移动端网站开发用的是java吗互联网产品推广
  • 做旅游那些网站好搜索量用什么工具查询
  • 北京建网站定制价格吉林seo管理平台
  • 济南网站建设公司有哪些网页制作app
  • 辽宁建网站miy188coo免费入口
  • 织梦网站优化百度收录推广
  • 阿里巴巴国际站操盘官认证考试博客网站登录
  • 做淘宝客必须建网站吗营销咨询