go学习part20(2)反射细节

news2024/9/23 23:33:50

1.反射细节

1) reflect.Value.Kind,获取变量的类别,返回的是一个常量(看手册)
 

2)Type是类型,Kind是类别

Type和Kind可能是相同的,也可能是不同的.

比如: var num int = 10 num的Type是int , Kind也是int
比如: var stu Student stu的Type是包名.Student , Kind是struct。

区别理解:Kind指的是在go语言里你的这个变量具体是属于哪一种大类,比如stu属于struct,本质是一个常量,如果是nil表示非法分类。

                Type指的是一个变量具体属于哪一类,比如stu属于学生结构体Student

 

package main

import (
	"fmt"
	"reflect"
)

func reflectTest01(b interface{}) {
	//通过反射获取的传入的变量的 type , kind,值
	//感觉有点像包装一个类型结构体然后绑定String()方法输出内部数值。
	//实际类型是一个包装类型,但是输出内容的都是内部存储类型。
	//1。先获取到 reflect.Type
	rType := reflect.TypeOf(b)
	fmt.Println(rType) //真正类型是reflect.Type,但是输出会自动变成内部存储类型的实际类型int

	//2。先获取到 reflect.Value
	rVal := reflect.ValueOf(b)
	//报错cannot convert 2 (untyped int constant) to type struct{typ *reflect.rtype,
	//说明实际不是int类型而是reflect.Value
	//所以Value提供了很多方法去修改或者读取内部的值
	//n2 := 2 + rVal
	n2 := 2 + rVal.Int() //读取内部Int值
	fmt.Println(n2)
	fmt.Println(rVal) //真正类型是reflect.Value,但是输出会自动变成内部存储类型的实际值
	fmt.Printf("rVal内部数值:%v,rVal真正类型:%T\n", rVal, rVal)

	//3.将rVal转成interface{}
	iV := rVal.Interface() //把内部值按空接口类型输出
	//通过断言把interface{}转成需要的类型
	n3 := iV.(int)
	fmt.Println("n3=", n3)

}

type Student struct {
	Name string
	Age  int
}

// 对结构体反射
func reflectTest02(b interface{}) {
	//1。先获取到 reflect.Type
	rType := reflect.TypeOf(b)
	fmt.Println(rType) //真正类型是reflect.Type,但是输出会自动变成内部存储类型的实际类型int

	//2。先获取到 reflect.Value
	rVal := reflect.ValueOf(b)

	//获取对应Kind,从Value和Type都可以,一模一样
	kind1 := rVal.Kind()
	kind2 := rType.Kind()
	fmt.Printf("kind1内部数值:%v,kind1真正类型:%T\n", kind1, kind1)
	fmt.Printf("kind2内部数值:%v,kind2真正类型:%T\n", kind2, kind2)

	//3.将rVal转成interface{}
	iV := rVal.Interface()                        //把内部值按空接口类型输出
	fmt.Printf("iV 内部数值:%v,iV 真正类型:%T\n", iV, iV) //运行看实际类型,所以输出的是Student类型
	//虽然运行输出可以,但是想调用Student内容是不行的,编译不知道底层实际类型,所以需要通过断言把interface{}转成需要的类型
	stu, ok := iV.(Student) //也可以switch
	if ok {
		fmt.Println("stu.Name=", stu.Name)
	}

}

func main() {
	演示对(基本数据类型、interface{(}、reflect.value)进行反射的基本操作
	//1.定义int
	// var num int = 100
	// reflectTest01(num)

	//2.定义结构体
	stu := Student{
		Name: "tom",
		Age:  20,
	}

	reflectTest02(stu)
}

3. 变量和空接口和Reflect.Value可以相互转换

 4.Reflect.Value调用取基本类型的函数要求类型匹配,取结构体类型只能先断言再用,没有提供函数

5.通过反射的函数来修改变量

注意当使用setXxx方法来设置需要通过对应的指针类型来完成,这样才能改变传入的变量的值,同时需要使用到reflect.Value.Elem()方法

288_尚硅谷_反射的注意事项和细节(2)_哔哩哔哩_bilibili

注意:在反射函数里修改值的时候想要传指针,但是传指针就导致函数里Reflect.Value封装了指针类型的Value,会导致后续无法进行某些操作。

所以需要Elem方法,把一个封装了指针或者接口的Value转换成封装了它们指向(承载)的值的一个封装的Value

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/958672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1Java:JDK是什么

1Java是介于编译型语言和解释型语言之间 编译型语言:c c先编译成机器码,再执行 解释型语言:pytn 解释器直接加载源码运行,但是运行效果低 Java是将代码编译成一张字节码,优点 针对不同平台编写虚拟机,不同平台的虚拟…

【ctf题目系列】ctfwiki pwn类型

categories: ctf ret2shellcode [rootningan ret2shellcode]# ./ret2shellcode No system for you this time !!! 123 bye bye ~[rootningan ret2shellcode]#checksec检查 [rootningan ret2shellcode]# checksec ret2shellcode [!] Could not populate PLT: future feature …

二维数组创建方式比较

暑假跟着地质队去跑山了,到现在还没结束,今天休息的时候突然刷到了一篇关于C二维数组创建方面的文章,我觉得还是非常不错滴,就将其中提到的新方法和我已经使用过的三种方法进行了比较,发现该方法提高了二维数组的分配、…

机器学习前沿:改进自身缺陷,满足新战略

前机械师( 来源) 一、说明 机器学习在人工智能历史上扮演重要角色,然而,存在问题也不少。为了适应新时代和新任务,不做出重大改进是不可能的,本篇就一些突出问题和改进做出讨论。以便读者掌握未来的思路和方向。 二、机…

Python自动化运维之命令行参数(sys、argparse模块)

目录 一、sys.argv属性变量 二、argparse模块 一、sys.argv属性变量 sys.argv变量里面保存着命令行的参数列表。首个元素值为执行py脚本文件所在的路径。可以使用切片的方式来获取非脚本文件名的其它所有参数。 二、argparse模块 可以轻松地编写出用户体验友好的命令行界面…

【Linux】线程安全-互斥同步

文章目录 线程安全问题的引入线程互斥互斥概念互斥锁互斥锁的计数器当中如何保证原子性互斥锁基础API初始化互斥锁变量函数动态初始化静态初始化 加锁函数阻塞加锁非阻塞加锁带有超时时间的加锁 解锁函数销毁互斥锁函数 线程同步线程同步的必要性条件变量条件变量的使用原理条件…

冠达管理:龙头股票是什么意思?

龙头股票是指在某个职业或板块中市值最大、盈余才能最强、发展前景最好的上市公司。可以说,龙头股票是该职业或板块的代表。 那么,为什么龙头股票具有如此重要的地位?与其他股票比较,有哪些优势和下风?这篇文章将从多…

Stable Diffusion 从入门到企业级应用010

一、前言 本文是《Stable Diffusion 从入门到企业级应用实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》的第010篇 利用Stable Diffusion ControlNet 法线贴图模型精准控制图像生成。本部分内容,位于整个Stable Diffusion生态体…

节能减排数远程控制二次开发网关BL304

钡铼技术嵌入式ARM控制器BL304在各个领域的应用越来越广泛。从物联网、工业物联网,到数字化工厂、工业自动化,再到智慧医疗、智慧电力、智慧安防,以及车载、轨道交通、通讯、充电桩、智能家居、人机交互等,BL304都发挥着举足轻重的…

哈弗枭龙MAX将在9月上旬推出首次OTA升级,保不住电?不存在的

9月1日消息,哈弗品牌执行副总经理乔心昱昨晚通过个人微博向网友们回应了关于哈弗枭龙MAX电池保持的问题。乔心昱表示,在与紧急技术团队确认后,他首先澄清了一个误会:大家可以放心使用,正常情况下没有电池问题。 此外&a…

2023开学啦《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

2023开学啦《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

【UE 材质】常用向量运算节点——点积、叉积、归一化

目录 一、点积 二、叉积 三、归一化 一、点积 点积,也称为内积或数量积,是一种用于计算两个向量之间关系的操作。对于两个三维向量 A(a1,a2,a3)和 B(b1,b2,b3),它们的点积可以用以下公式表示: ABa1​⋅…

【业务功能篇93】微服务-springcloud-多线程-异步处理-异步编排-CompletableFutrue-实战运用

异步处理编排 我们可以在商品详细信息查询的位置实现CompletableFuture的异步编排处理。 根据业务分析:3.4.5数据接口的入参信息需要来源于1数据接口的返回信息,也就是skuid 所以可以设计 1 3 4 5 串行线程 ,而 3 4 5依赖1 ,需要等…

2023下半年深圳软考信息系统项目管理师认证开班中,快来报名

信息系统项目管理师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资…

运营超5000万公里,再签700辆订单,嬴彻卡车NOA引领商用车自动驾驶商业化

从主动安全到智能驾驶,商用车自动驾驶商业化进程已经明显提速。 8月29日,嬴彻科技举办以“奔跑吧 卡车NOA”为主题的第二届嬴彻科技日,宣布嬴彻卡车NOA(导航辅助驾驶)已经突破5000万公里,并实现安全运营零…

骨传导耳机有副作用吗?骨感耳机有什么弊端?

骨传导耳机是通过振动骨骼传达声音信号到内耳而非通过耳道传输的,因此相较于传统耳机,其对耳道和鼓膜的刺激较小,可以说骨传导耳机在使用中是没有副作用的。 不过,任何产品都不是十全十美的,那么骨传导耳机有什么弊端…

python 笔记(3)——request

目录 1、使用requests发送http请求 1-1)发送get请求 1-2)发送 post 请求 1-3)发送 get 请求下载网络图片 1-4)使用 post 上传文件 1-5)自动维护 session 的方式 2、使用 os.popen 执行cmd命令 3、基于 beautif…

Git学习——细节补充

Git学习——细节补充 1. git diff2. git log3. git reset4. git reflog5. 提交撤销5.1 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时5.2 当提交到了stage区后,想要退回 6. git remote7. git pull origin master --no-rebase8. 分支管理9. g…

【100天精通python】Day46:python网络编程_网络编程基础与入门

目录 专栏导读 1 网络编程的基础 2. 基本概念和协议 2.1 计算机网络基础 2.2 网络协议、IP地址、端口号 2.3 常见网络协议 3. 套接字编程 3.1 套接字的基本概念 3.2 套接字的基本操作 3.3 套接字通信模型和方法:send、recv 3.3.1 TCP通信模型 3.3.2 U…

linux-samba-window登不上

登不上查了很久发现是防火墙导致的 sudo firewall-cmd --list-all //查看所有的防火墙信息sudo firewall-cmd --permanent --zonepublic --add-servicesamba //service里添加sambafirewall-cmd --reload //重启 便可以登录了,小问题