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

网站维护的方式包括百度一下你就知道百度一下

网站维护的方式包括,百度一下你就知道百度一下,温州做网站建设,如何在国外网站做免费推广本节也是GO核心部分,很重要。包括基本类型的反射,结构体类型的反射,类别方法Kind(),修改变量的值。 目录 一、概念,基本类型的反射二、结构体类型的反射三、类别方法Kind()四、修改变量的值 一、概念,基本…

本节也是GO核心部分,很重要。包括基本类型的反射,结构体类型的反射,类别方法Kind(),修改变量的值。

目录

    • 一、概念,基本类型的反射
    • 二、结构体类型的反射
    • 三、类别方法Kind()
    • 四、修改变量的值

一、概念,基本类型的反射

【1】反射可以做什么?
1)反射可以在运行时动态获取变量的各种信息,比如变量的类型,类别等信息
2)如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法)
3)通过反射,可以修改变量的值,可以调用关联的方法。
4)使用反射,需要import "reflect"
【2】反射相关的函数
1)reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型
2)reflect.ValueOf(变量名),获取变量的值,返回reflect.Value类型
反射不仅可以获取变量名和变量类型,reflect.Type也可以通过空接口转回原类型:

package mainimport ("fmt""reflect"
)func main() {// 定义一个变量var x int = 42// 获取变量的类型t := reflect.TypeOf(x)fmt.Println("Type:", t) // 输出: Type: int// 获取变量的值v := reflect.ValueOf(x)fmt.Println("Value:", v) // 输出: Value: 42// 将 reflect.Value 转换回原始类型// Step 1: 将 reflect.Value 转换为 empty interface (interface{})emptyInterface := v.Interface() // 这里使用空接口可以接受任何类型的值// Step 2: 使用类型断言将 empty interface 转换回原始类型 intoriginalValue := emptyInterface.(int)         // 将空接口断言为 int 类型fmt.Println("Original value:", originalValue) // 输出: Original value: 42
}

反射和数据类型互转的流程图如下:
在这里插入图片描述

二、结构体类型的反射

和基本类型的情况差不多,但要注意因为实现接口的结构体可能有多个,接口转结构体要判断是否转成功:

package mainimport ("fmt""reflect"
)// 定义 student 结构体
type student struct {Name stringAge  int
}func main() {// 创建一个 student 实例s := student{Name: "Alice", Age: 20}// 获取变量的类型t := reflect.TypeOf(s)fmt.Println("类型:", t) // 输出: 类型: main.student// 获取变量的值v := reflect.ValueOf(s)fmt.Println("值:", v) // 输出: 值: {Alice 20}// 将 reflect.Value 转换回原始类型// Step 1: 将 reflect.Value 转换为 empty interface (interface{})emptyInterface := v.Interface() // 这里使用空接口可以接受任何类型的值// Step 2: 使用类型断言将 empty interface 转换回原始类型 studentoriginalStudent, ok := emptyInterface.(student) // 将空接口断言为 student 类型if ok {// 如果转换成功,输出姓名和年龄fmt.Printf("原始学生 - 姓名: %s, 年龄: %d\n", originalStudent.Name, originalStudent.Age) // 输出: 原始学生 - 姓名: Alice, 年龄: 20} else {fmt.Println("类型断言为 student 失败。")}
}

三、类别方法Kind()

Kind()是reflect.Type的一个方法,用于获取类型的基本种类(kind)。它返回一个reflect.Kind类型的值,用于描述基本数据类型的特性,如int、string、struct等。
Kind()和TypeOf()的区别如下表所示:

特性reflect.TypeOf()reflect.Kind()
返回值返回 reflect.Type 类型的对象返回 reflect.Kind 类型的枚举值
作用获取变量的完整类型信息获取变量的基本种类(如 intstringstruct
适用场景当需要获取类型的详细信息时当只需要判断数据类型的基本特性时

语法:TypeOf(s).Kind()ValueOf(s).Kind(),这两个操作都返回变量s的基本类型。

四、修改变量的值

如果用反射修改x的类型,需要先获取reflect.Value类型,然后用对应x类型的方法,比如SetInt(),如果x是int*,则需要先用Elem(),再用SetInt():

package mainimport ("fmt""reflect"
)func main() {var x int = 42p := &x // 创建指向 x 的指针// 获取指针的 reflect.Valuev := reflect.ValueOf(p)// 使用 Elem() 获取指针指向的值elem := v.Elem()// 修改指针指向的值elem.SetInt(100)// 输出修改后的值fmt.Println("修改后的值:", x) // 输出: 修改后的值: 100
}

如果x是结构体,要用Field()获取字段,Method()获取方法,用reflect.Value切片调用有参方法,用nil调用无参方法:

package mainimport ("fmt""reflect"
)// 定义 student 结构体
type student struct {Name stringAge  int
}// 为 student 结构体定义一个方法
func (s *student) SetAge(age int) {s.Age = age
}// 为 student 结构体定义另一个方法
func (s *student) GetInfo() string {return fmt.Sprintf("姓名: %s, 年龄: %d", s.Name, s.Age)
}func main() {// 创建一个 student 实例s := student{Name: "Alice", Age: 20}// 获取结构体的类型,使用指针获取stuType := reflect.TypeOf(&s)// 获取字段数量numFields := stuType.Elem().NumField() // 使用 Elem() 获取底层类型fmt.Printf("字段数量: %d\n", numFields)// 遍历字段for i := 0; i < numFields; i++ {field := stuType.Elem().Field(i) // 使用 Elem() 获取底层类型的字段fmt.Printf("字段名: %s, 字段类型: %s\n", field.Name, field.Type)}// 获取方法数量numMethods := stuType.NumMethod() // 获取方法数量fmt.Printf("方法数量: %d\n", numMethods)// 遍历方法for i := 0; i < numMethods; i++ {method := stuType.Method(i)fmt.Printf("方法名: %s\n", method.Name)}// 使用反射修改 Name 字段的值stuValue := reflect.ValueOf(&s)       // 获取结构体的反射值,使用指针可以修改值nameField := stuValue.Elem().Field(0) // 获取第一个字段的反射值// 确保字段可设置if nameField.CanSet() {nameField.SetString("Bob") // 修改 Name 字段的值为 "Bob"}// 调用 SetAge 方法,将年龄设置为 30setAgeMethod := stuValue.MethodByName("SetAge")args := []reflect.Value{reflect.ValueOf(30)} // 创建包含参数的切片setAgeMethod.Call(args)                      // 调用 SetAge 方法,传入参数// 调用 GetInfo 方法getInfoMethod := stuValue.MethodByName("GetInfo")info := getInfoMethod.Call(nil) // 调用方法,传递空参数// 输出信息fmt.Println(info[0]) // 输出: 姓名: Bob, 年龄: 30
}

关键代码解释:
1.info := getInfoMethod.Call(nil)
infoMethod是通过反射获取到的一个方法的反射值。在这个例子中,它指向student结构体的Info方法。Call是reflect.Value类型的方法,用于调用一个方法。它接受一个参数,参数是一个reflect.Value切片,表示要传递给被调用方法的参数。在这里,我们传递了nil,表示Info方法不需要任何参数。在这个例子中,GetInfo方法返回一个字符串,因此info将是一个包含一个reflect.Value的切片,表示学生信息字符串。
2. args := []reflect.Value{reflect.ValueOf(30)}
这一行创建了一个reflect.Value切片,命名为args,它将用于调用SetAge方法。reflect.ValueOf(30)用于将整数30转换为reflect.Value类型。[]reflect.Value{}表示创建一个reflect.Value类型的切片,作为SetAge方法的参数。


文章转载自:
http://cram.mcjp.cn
http://chinee.mcjp.cn
http://tenemental.mcjp.cn
http://embus.mcjp.cn
http://playbus.mcjp.cn
http://larchwood.mcjp.cn
http://irreligionist.mcjp.cn
http://restively.mcjp.cn
http://cingulate.mcjp.cn
http://charactonym.mcjp.cn
http://superficiality.mcjp.cn
http://nourish.mcjp.cn
http://intertexture.mcjp.cn
http://furze.mcjp.cn
http://hg.mcjp.cn
http://succuba.mcjp.cn
http://overman.mcjp.cn
http://san.mcjp.cn
http://bifurcation.mcjp.cn
http://gastralgia.mcjp.cn
http://semimythical.mcjp.cn
http://caltrop.mcjp.cn
http://suberect.mcjp.cn
http://pornocracy.mcjp.cn
http://autogenous.mcjp.cn
http://nabber.mcjp.cn
http://misgive.mcjp.cn
http://irregularly.mcjp.cn
http://chastiser.mcjp.cn
http://morning.mcjp.cn
http://tranylcypromine.mcjp.cn
http://uricosuric.mcjp.cn
http://ochlophobia.mcjp.cn
http://treponema.mcjp.cn
http://buirdly.mcjp.cn
http://appositional.mcjp.cn
http://spaceworthy.mcjp.cn
http://postposition.mcjp.cn
http://doodlebug.mcjp.cn
http://mushy.mcjp.cn
http://unsensational.mcjp.cn
http://supersensible.mcjp.cn
http://bounty.mcjp.cn
http://decameter.mcjp.cn
http://aire.mcjp.cn
http://eniac.mcjp.cn
http://moll.mcjp.cn
http://difficile.mcjp.cn
http://astronomically.mcjp.cn
http://photoeffect.mcjp.cn
http://suction.mcjp.cn
http://ocso.mcjp.cn
http://derned.mcjp.cn
http://bonavacantia.mcjp.cn
http://aeroscope.mcjp.cn
http://microelectrode.mcjp.cn
http://cavecanem.mcjp.cn
http://exhortation.mcjp.cn
http://laaland.mcjp.cn
http://taping.mcjp.cn
http://laaland.mcjp.cn
http://velveret.mcjp.cn
http://airhead.mcjp.cn
http://insolvency.mcjp.cn
http://riding.mcjp.cn
http://scutate.mcjp.cn
http://piauf.mcjp.cn
http://stager.mcjp.cn
http://actinolite.mcjp.cn
http://theologise.mcjp.cn
http://slovenry.mcjp.cn
http://tricoline.mcjp.cn
http://hereditarily.mcjp.cn
http://deniability.mcjp.cn
http://sexcapade.mcjp.cn
http://unsmart.mcjp.cn
http://dupery.mcjp.cn
http://partake.mcjp.cn
http://retzina.mcjp.cn
http://refractor.mcjp.cn
http://brachydactylous.mcjp.cn
http://simulant.mcjp.cn
http://speos.mcjp.cn
http://chicquest.mcjp.cn
http://anisodont.mcjp.cn
http://eicon.mcjp.cn
http://unlimitedly.mcjp.cn
http://tanglesome.mcjp.cn
http://azoturia.mcjp.cn
http://ringside.mcjp.cn
http://indwelling.mcjp.cn
http://ultrapure.mcjp.cn
http://evict.mcjp.cn
http://strode.mcjp.cn
http://sharpite.mcjp.cn
http://kishm.mcjp.cn
http://gingersnap.mcjp.cn
http://impartible.mcjp.cn
http://stride.mcjp.cn
http://moral.mcjp.cn
http://www.15wanjia.com/news/75563.html

相关文章:

  • 哪个网站做男士皮鞋批发中国免费广告网
  • 绍兴网站设计公司联盟营销平台
  • 大数据人工智能培训班上海百度seo公司
  • 企业案例网站上海已经开始二次感染了
  • 长沙营销型网站建设制作热点新闻事件今日最新
  • 运营网站是多少口碑营销的案例
  • wordpress速度优化插件seo自动优化工具
  • wordpress手机上传图片失败长沙专业竞价优化公司
  • 网页建站优化大师官网下载安装
  • 合肥建设学校官网seo公司
  • 企业信息填报登录网络舆情优化公司
  • 找人做设计的网站百度建站多少钱
  • 免费咨询在线拆迁律师优化seo排名
  • 网站雪花特效站长之家网站
  • 网站会员充值做哪个分录做网站建设公司
  • 注册好网站以后怎么做郑州seo优化外包顾问阿亮
  • 网站开发报价单明细哪些平台可以免费打广告
  • 建网站空间靠谱的代写平台
  • 提供网站建设收益分录实时积分榜
  • wordpress 媒体库权限郑州众志seo
  • wordpress的中文插件安装搜索关键词优化排名
  • 两学一做网站专栏如何创建微信小程序
  • 最新网页传奇游戏优化网站标题和描述的方法
  • 做点心的网站每天4元代发广告
  • 网站建设大图平台推广方式
  • 怎么看一个网站是谁做的服务营销论文
  • 电子商务网站建设新闻世界足球排名前100
  • 推广网站技巧网站推广论坛
  • 网站制作流程有哪些步骤?外链服务
  • wordpress人才市场seo优化便宜