golang reflect

reflect包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型interface{}保存一个值,通过调用TypeOf获取其动态类型信息,该函数返回一个Type类型值。调用ValueOf函数返回一个Value类型值,该值代表运行时的数据。Zero接受一个Type类型参数并返回一个代表该类型零值的Value类型值

type

package mainimport ("reflect""fmt"
)type lx interface {SayHi()
}type User struct {Name stringAge  int64Sex  string
}func (u *User) SayHi() {fmt.Println("hello world")
}func main() {user := User{"张三", 25, "男"}FillStruct(user)
}func FillStruct(obj interface{}) {t := reflect.TypeOf(obj)       //反射出一个interface{}的类型fmt.Println(t.Name())          //类型名fmt.Println(t.Kind().String()) //Type类型表示的具体分类fmt.Println(t.PkgPath())       //反射对象所在的短包名fmt.Println(t.String())        //包名.类型名fmt.Println(t.Size())          //要保存一个该类型要多少个字节fmt.Println(t.Align())         //返回当从内存中申请一个该类型值时,会对齐的字节数fmt.Println(t.FieldAlign())    //返回当该类型作为结构体的字段时,会对齐的字节数var u Userfmt.Println(t.AssignableTo(reflect.TypeOf(u)))  // 如果该类型的值可以直接赋值给u代表的类型,返回真fmt.Println(t.ConvertibleTo(reflect.TypeOf(u))) // 如该类型的值可以转换为u代表的类型,返回真fmt.Println(t.NumField())             // 返回struct类型的字段数(匿名字段算作一个字段),如非结构体类型将panicfmt.Println(t.Field(0).Name)          // 返回struct类型的第i个字段的类型,如非结构体或者i不在[0, NumField())内将会panicfmt.Println(t.FieldByName("Age"))     // 返回该类型名为name的字段(会查找匿名字段及其子字段),布尔值说明是否找到,如非结构体将panicfmt.Println(t.FieldByIndex([]int{0})) // 返回索引序列指定的嵌套字段的类型,等价于用索引中每个值链式调用本方法,如非结构体将会panic
}



Value

package mainimport ("reflect""fmt"
)type User struct {Name  stringAge   intSex   boolPhone *stringQian  float64Atest uintGroup interface{}Btest interface{}
}func (u *User) Hello() {fmt.Println("hello world 你好世界")
}func main() {a := "hello world 你好世界"user := &User{"张三", 25, true, &a, 88.8, 9, 99, nil}var obj interface{} = userv := reflect.ValueOf(obj)method := v.MethodByName("Hello") //返回v的名为Hello的方法method.Call([]reflect.Value{})    //执行反射的方法fmt.Println(v.IsValid()) //返回v是否持有值,如果v是value零值会返回假,此时v除了IsValid String Kind之外的方法都会导致panicfmt.Println(v.Kind())    //返回v持有值的分类,如果v是value零值,返回值为invalidfmt.Println(v.Type())    //返回v持有值的类型Type表示v = v.Elem() //返回持有的接口的值,或者指针的值,如果不是interface{}或指针会panic,实际上是从 *User到Uservar u Userfmt.Println(v.Convert(reflect.TypeOf(u)).FieldByName("Name")) //转换为其他类型的值,如果无法使用标准Go转换规则来转换,那么panicfmt.Println(v.FieldByName("Name").CanSet())   //是否可以设置Name的值v.FieldByName("Name").SetString("把Name值修改一下") //设置v的持有值,如果v的kind不是string或者v.Canset()返回假,会panicv.FieldByName("Name").Set(reflect.ValueOf(a)) //将v的持有值修改为a的反射值,如果Canset返回假,会panicfmt.Println(v.FieldByName("Group").Elem())     //返回持有的接口的值,或者指针的值,如果不是interface{}或指针会panicfmt.Println(v.FieldByName("Phone").Elem())     //或者指针的值fmt.Println(v.FieldByName("Name").Interface()) //把Name当做interface{}值fmt.Println(v.FieldByName("Name").String()) //返回v持有的值的字符串表示,如果v的值不是string也不会panicfmt.Println(v.FieldByName("Sex").Bool())    //返回持有的布尔值,如果v的kind不是bool会panicfmt.Println(v.FieldByName("Age").Int())     //返回持有的int64,如果v的kind不是int int8-int64会panicvar x int64fmt.Println(v.FieldByName("Age").OverflowInt(x)) //如果v持有值的类型不能无一出的表示x,会返回真,如果v的kind不是int int8-int64会panicfmt.Println(v.FieldByName("Atest").Uint())       //返回v持有的无符号整数,如果v的kind不是uint uintptr uint8 uint16 uint32 uint64会panicvar x2 uint64fmt.Println(v.FieldByName("Atest").OverflowUint(x2)) //如果v持有的值的类型不能无溢出的表示x2,会返回真,如果v的kind不是uint uintptr uint8 uint16 uint32 uint64会panicfmt.Println(v.FieldByName("Qian").Float())           //返回v持有的浮点数float64,如果v的kind不是float32 float64会panicvar x3 float64fmt.Println(v.FieldByName("Qian").OverflowFloat(x3)) //如果v持有值的类型不能无溢出的表示x3,会返回真,如果v的kind不是float32 float64会panicfmt.Println(v.FieldByName("Btest").IsNil())          //如果v持有值是否为nil,如果v的值不是通道 函数 接口 映射 指针 切片之一会panicfmt.Println(v.NumField())             //返回v持有的结构体类型值的字段数,如果v的kind不是struct会panicfmt.Println(v.Field(0))               //返回结构体的第i个字段,如果v的kind不是struct或i出界会panicfmt.Println(v.FieldByIndex([]int{0})) //和上面一样,没明白有啥用}




转载于:https://my.oschina.net/tongjh/blog/513540

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

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

相关文章

DB2常用命令

查看DB2License信息 DB2基础命令 转载于:https://www.cnblogs.com/arcer/p/5573317.html

.NET7 Preview4之MapGroup

这篇是“闻(看)香(码)识(学)女(技)人(术)”。这也是一个有意思的功能,路由分组,啥也不说了,看代码看结果:using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.OpenApi;var builder WebApplication.Create…

【空间数据库】ArcGIS 10.6 Database_Server_Desktop安装、连接数据库服务、创建企业级数据库(附server10.6.ecp)

由于作者一直使用SQL Server 2008 R2开发版,之前在ArcGIS中创建企业级数据库都是基于单独安装的SQL Server 2008 R2开发版,今天我们演示安装ArcGIS10.6自带的数据库服务(SQL Server 2014 Express版本)、连接数据库服务和创建数据库。 首先,我们来看一下完整的ArcGIS10.6安…

(一)easyUI之树形网络

树形网格&#xff08;TreeGrid&#xff09;可以展示有限空间上带有多列和复杂数据电子表 一、案例一&#xff1a;按tree的数据结构来生成 前台<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DO…

《看聊天记录都学不会C语言?太菜了吧》(4)零基础的我原来早就学会编程了?

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

Android之华为平板打日志提示Permission denied

1 问题 $ adb logcat | grep ssfsafaf int logctl_get(): open /dev/hwlog_switch fail -1, 13. Permission deniedNote: log switch off, only log_main and log_events will have logs!2 解决办法 1&#xff09;、如果是华为手机&#xff0c;打开手机的拨号界面&#xff0c…

二叉树结构 codevs 1029 遍历问题

codevs 1029 遍历问题 时间限制: 1 s空间限制: 128000 KB题目等级 : 钻石 Diamond题目描述 Description我们都很熟悉二叉树的前序、中序、后序遍历&#xff0c;在数据结构中常提出这样的问题&#xff1a;已知一棵二叉树的前序和中序遍历&#xff0c;求它的后序遍历&#xff0c;…

java的概率的程序_java实现一个抽奖概率类

在一些项目需求中&#xff0c;可能会遇到抽奖问题&#xff0c;如提供一系列奖品及获奖概率&#xff0c;要求根据概率返回每次抽到的奖品。以下是本人在实际项目中写的一个抽奖工具类&#xff0c;与大家共同分享&#xff1a;import java.util.ArrayList;import java.util.List;i…

【空间数据库】ArcGIS10.6连接PostgreSQL数据库并显示数据至ArcMap中

前面的文章《【开源数据库】Windows操作系统PostgreSQL+PostGIS环境搭建图文安装教程 》讲解了在Windows上安装开源GIS和开源数据库。本文接着来讲采用ArcGIS 10.6连接PostgreSQL数据库,并加载矢量数据到ArcMap中。 我们已经在pgAdmin中创建了一个空间数据库test,并导入了Sha…

算法-低位优先的字符串排序

低位优先的字符串排序相当于是对键索引计数方法的一个扩展&#xff0c;主要用于处理固定长度字符串&#xff0c;比如说手机号&#xff0c;固定电话&#xff0c;银行卡卡号&#xff0c;字符串的长度为N&#xff0c;从右向左开始进行每个键作为值开始遍历&#xff0c;实现比较简单…

使用 AgileConfig 动态配置 NLog

NLog 是我们在 .NET 领域使用非常广泛的日志组件。它默认使用 xml 来维护它的配置。最近有几个同学问我当使用 AgileConfig 的时候如何配置 NLog 。因为 AgileConfig 不支持集成 xml 格式的配置。其实 NLog 是支持从 appsettings.json / IConfiguration 读取配置的&#xff0c;…

systemd      kernel

Systemd&#xff1a;Systemd的新特性&#xff1a;1.在系统引导的时候可以实现服务的并行启动&#xff1b;2.能够实现按需激活进程&#xff1b;在系统启动时&#xff0c;需要随系统启动服务&#xff0c;其服务进程并没有启动&#xff0c;但是Systemd为每一个此类服务进程都注册了…

Android之提示Method return type must not include a type variable or wildcard:

1 问题 调用retrofit的时候提示错误如下 Method return type must not include a type variable or wildcard: io.reactivex.Observable<package.class<?>> 2 原因 我们知道英文单词variable是多变的&#xff0c;易变的意思&#xff0c;然后 wildcard是未知数的…

《看聊天记录都学不会C语言?太菜了吧》(5)打了一把游戏我学会了一个编程知识?

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

【QGIS入门实战精品教程】2.1:初识QGIS软件

从今天开始&#xff0c;我们一起来学习一款免费开源、对机器要求低、功能强大的GIS软件&#xff1a;QGIS &#xff01; 一、QGIS简介 QGIS&#xff08;原称Quantum GIS&#xff09;是一个自由软件的桌面GIS软件。它提供数据的显示、编辑和分析功能。 QGIS是一个用户界面友好的…

Android深度探索(卷1)HAL与驱动开发第六章总结

操作系统是通过各种驱动程序赖家与硬件设备的&#xff0c;它为用户屏蔽了各种各样的设备&#xff0c;驱动硬件是操作系统最基本的功能&#xff0c;并且提供统一的操作方式。设备驱动程序是操作系统最基本的组成部分之一&#xff0c;在Linux内核源程序中也占有60%以上&#xff0…

es mysql 同步插件_[es和数据库怎么同步]mysql与elasticsearch实时同步常用插件及优缺点对比(ES与关系型数据库同步)...

目前mysql与elasticsearch常用的同步机制大多是基于插件实现的&#xff0c;常用的插件包括&#xff1a;elasticsearch-jdbc,elasticsearch-river-MySQL,go-mysql-elasticsearch,logstash-input-jdbc。本文对四种插件的优缺点进行了图表对比。|序号|插件名称|地址|——:————…

linux上怎么快速删除一个目录?

使用rm -rf命令转载于:https://www.cnblogs.com/dyh-air/p/7726611.html

关于是否在C#中加入不可空引用类型的争论

来自微软的Mads Togersen在近期所提出的一条提议&#xff0c;即在C#语言中加入对不可空引用类型的支持在.NET社区中引起了热烈的争论。人们对此提议的反应大相径庭&#xff0c;既有人对此表示赞赏&#xff0c;也不乏倾向于保持现状的意见。\\在Reddit上&#xff0c;这条提议引起…

Andorid之提示java.lang.RuntimeException: Unable to start service net.gotev.uploadservice.UploadService@

1 问题 用android-upload-service上传一个文件提示错误如下 04-15 17:46:33.245 24932 24932 E AndroidRuntime: Process: com.appsinnova.android.keepshare, PID: 24932 04-15 17:46:33.245 24932 24932 E AndroidRuntime: java.lang.RuntimeException: Unable to start se…