golang的reflection(转)(一)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

反射reflection

  • 可以大大提高程序的灵活性,使得interface{}有更大的发挥余地
  • 反射可以使用TypeOf和ValueOf函数从接口中获取目标对象信息
  • 反射会将匿名字段作为独立字段(匿名字段的本质)
  • 想要利用反射修改对象状态,前提是interface.data是settable,即pointer-interface
  • 通过反射可以“动态”调用方法

常用的类型、函数和方法

//返回动态类型i的类型,如果i是一个空结构体类型,TypeOf将返回nil
func TypeOf(i interface{}) Type//Type 接口类型
type Type interface {Align() intFieldAlign() int//指定结构体中方法的下标,返回某个方法的对象,需要注意的是返回的Method是一个独立的结构体Method(int) Method/*type Method struct {Name stringPkgPath stringType TypeFunc ValueIndex int}*/MethodByName(string) (Method, bool)//返回该结构体类型的方法下标NumMethod() int//返回类型的名称,即动态类型i的名称Name() stringPkgPath() stringSize() uintptrString() stringKind() KindImplements(u Type) boolAssignableTo(u Type) boolConvertibleTo(u Type) boolComparable() boolBits() intChanDir() ChanDirIsVariadic() boolElem() Type//返回结构体类型第i个字段Field(i int) StructField//StructField结构体//type StructField struct {// Name string// PkgPath string// Type Type// Tag  StructTag// Offset uintptr// Index []int// Anonymous bool//根据结构体字段索引获取嵌入字段的结构体信息FieldByIndex(index []int) StructFieldFieldByName(name string) (StructField, bool)FieldByNameFunc(match func(string) bool) (StructField, bool)In(i int) TypeKey() TypeLen() int//返回动态类型i(结构体字段)的字段总数NumField() intNumIn() intNumOut() intOut(i int) Type
}//返回接口i的一个初始化的新值.ValueOf(nil)返回一个零值
func ValueOf(i interface{}) Value// Value结构体
type Value struct {}
// Value结构体的一些方法
// 返回结构体v中的第i个字段。如果v的类型不是结构体或者i超出了结构体的范围,则会出现panic
func (v Value) Field(i int) Value//以接口类型返回v的当前值
func (v Value) Interface() (i interface{})
//等价于.
var i interface{} = (v's underlying value)//通过反射方式修改结构体对象的一些方法//返回接口v包含或者指针v包含的值
func (v Value) Elem() Value
//判断该接口v是否可以被set修改
func (v Value) CanSet() bool//使用另外一个反射接口去修改反射值
func (v Value) Set(x Value)
//其他不同类型的Set
func (v Value) SetBool(x bool)
func (v Value) SetBytes(x []byte)
func (v Value) SetFloat(x float64)
func (v Value) SetInt(x int64)
//设置结构体对象v的长度为n
func (v Value) SetLen(n int)
func (v Value) SetString(x string)//一些辅助方法
//返回反射结构体的Value的类型.如果v为零值,IsValid将返回false
func (v Value) Kind() Kind
//判断value是否为有效值,通常用在判断某个字段是否在反射体的Value中
func (v Value) IsValid() bool//Kind常量
type Kind uint
const (Invalid Kind = iotaBoolIntInt8Int16Int32Int64UintUint8Uint16Uint32Uint64UintptrFloat32Float64Complex64Complex128ArrayChanFuncInterfaceMapPtrSliceStringStructUnsafePointer
)

 

反射的基本操作

通过反射来获取结构体字段的名称以及其他相关信息。

package mainimport ("fmt""reflect"
)//定义结构体
type User struct {Id   intName stringAge  int
}//定义结构体方法
func (u User) Hello() {fmt.Println("Hello xuxuebiao")
}func main() {u := User{1, "bgops", 25}Info(u)u.Hello()
}//定义一个反射函数,参数为任意类型
func Info(o interface{}) {//使用反射类型获取o的Type,一个包含多个方法的interfacet := reflect.TypeOf(o)//打印类型o的名称fmt.Println("type:", t.Name())//使用反射类型获取o的Value,一个空的结构体v := reflect.ValueOf(o)fmt.Println("Fields:")//t.NumField()打印结构体o的字段个数(Id,Name,Age共三个)for i := 0; i < t.NumField(); i++ {//根据结构体的下标i来获取结构体某个字段,并返回一个新的结构体/**type StructField struct {Name stringPkgPath stringType      TypeTag       StructTagOf

转载于:https://my.oschina.net/u/3683692/blog/3039768

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

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

相关文章

idea教程--Maven 骨架介绍

简单的说&#xff0c;Archetype是Maven工程的模板工具包。一个Archetype定义了要做的相同类型事情的初始样式或模型。这个名称给我们提供来了一个一致的生成Maven工程的方式。Archetype会帮助作者给用户创建Maven工程模板&#xff0c;并给用户提供生成相关工程模板版本的参数化…

datatables.js 简单使用--多选框和服务器端分页

说明&#xff1a;datatables是一款jQuery表格插件。感觉EasyUI的datagrid更易用 内容&#xff1a;多选框和服务器端分页 缘由&#xff1a;写这篇博客的原因是datatables的文档写的不怎么样&#xff0c;找东西很麻烦 环境&#xff1a;asp.net mvc , vs2015sqlserver2012 显示效…

python异常(高级) Exception

异常(高级) Exception 异常回顾:     try-except 语句 捕获(接收)异常通知,把异常流程变为正常流程     try-finally 语句 执行必须要执行的语句.     raise 语句 发送异常通知,同时进入异常流程     assert 语句 发送AssertionError异常     with 语句 wi…

反射赋值

目前例子为NPOI Excel导入 入库时调用 var file file1.PostedFile.InputStream;var fileExt System.IO.Path.GetExtension(file1.FileName);IWorkbook workbook;if (fileExt ".xlsx")workbook new XSSFWorkbook(file);elseworkbook new HSSFWorkbook(file);DB.D…

基于PCA(主成分分析)的人脸识别

代码下载&#xff1a;基于PCA&#xff08;主成分分析&#xff09;的人脸识别 人脸识别是一个有监督学习过程&#xff0c;首先利用训练集构造一个人脸模型&#xff0c;然后将测试集与训练集进行匹配&#xff0c;找到与之对应的训练集头像。最容易的方式是直接利用欧式距离计算测…

从BMW Vision iNEXT 看宝马如何进军自动驾驶

安全很重要&#xff0c;空间也要很大&#xff0c;砍掉大量物理按键&#xff0c;内饰材料要环保&#xff0c;还要提供自动和主动两套驾驶方案。这些描述仅是BMW Vision iNEXT&#xff08;下称Vision iNEXT&#xff09;概念车的设计之冰山一角。 一款概念车当然无法完全代表未来…

CSS浮动(二)---Float

重新认识float 2.1. 误解和“误用” 既然提到“误用”&#xff0c;各位看官就此想想&#xff0c;自己平日是怎么使用float的&#xff1f;另外&#xff0c;既然“误用”加了引号&#xff0c;就说明这样的使用并不是真正的误用&#xff0c;而是误打误撞使用之后&#xff0c;带…

Hadoop0.20.2版本在Ubuntu下安装和配置

1、安装JDK   &#xff08;1&#xff09;下载安装JDK&#xff1a;确保计算机联网之后命令行输入下面命令安装JDK   sudo apt-get install sun-java6-jdk   &#xff08;2&#xff09;配置计算机Java环境&#xff1a;打开/etc/profile&#xff0c;在文件最后输入下面内容 …

云原生生态周报 Vol. 2

业界要闻 Kubernetes External Secrets 近日&#xff0c;世界上最大的域名托管公司 Godaddy公司&#xff0c;正式宣布并详细解读了其开源的K8s外部 Secrets 管理项目&#xff1a; Kubernetes External Secrets&#xff0c;简称KES。这个项目定义了ExternalSecrets API&#xff…

centos 7新机使用前操作

关闭防火墙 systemctl stop firewalld&#xff08;停服务&#xff09; systemctl status firewalld&#xff08;看状态&#xff09; systemctl disable firewalld.service &#xff08;永久关闭&#xff09; selinux getenforce&#xff08;查状态&#xff09; vi /etc/selinux…

ubuntu10.04+hadoop0.20.2平台配置(完全分布式模式)

配置环境及有关工具&#xff1a;ubuntu10.04 、hadoop0.20.2 、 jdk1.6.0_29 我们的机器有三台&#xff0c;一台当作namenode、两台当作datanode&#xff1a; namenode&#xff1a;IP:192.168.0.25、机器名&#xff1a;kiddenzj &#xff08;这里的机器名要注意&#xff1a;机…

成佛、远不止渡沧海

地之及东南&#xff0c;有一海&#xff0c;称为“沧海”。沧海对面&#xff0c;就是仙家佛地。凡是能渡过沧海到达彼岸的人&#xff0c;就能立地成佛&#xff0c;修成正果。 于是&#xff0c;许许多多的人千里迢迢赶来&#xff0c;或乘帆船&#xff0c;或乘木筏&#xff0c;纷纷…

软件架构演进

传统架构到分布式架构详解 软件架构演进软件架构的发展经历了从单体架构、垂直架构、SOA架构到微服务架构的过程&#xff0c;博客里写到了这四种架构的特点以及优缺点分析&#xff0c;个人学习之用&#xff0c;仅供参考&#xff01; 1.1.1 单体架构 特点&#xff1a;1、所有的…

hadoop0.20.0第一个例子

这是Hadoop学习全程记录第2篇&#xff0c;在这篇里我将介绍一下如何在Eclipse下写第一个MapReduce程序。 新说明一下我的开发环境&#xff1a; 操作系统&#xff1a;在windows下使用wubi安装了ubuntu 10.10 hadoop版本&#xff1a;hadoop-0.20.2.tar.gz Eclipse版本&…

IDEA 修改JavaWeb的访问路径

问题描述 对于我这个刚刚使用IDEA不久的新手来说&#xff0c;能够正常运行就不错了,不过到了后面&#xff0c;可能会觉得IDEA给你分配的默认访问路径很不顺手&#xff0c;比如访问的时候需要通过: http://localhost:8080/web_war_exploded/ 来访问&#xff0c;对于web_w…

防撞库基本要求

专用安全要求 口令要求 设计要求说明 要求 是否满足 密码长度至少 8位字符&#xff0c;密码复杂性要求至少包含以下4种类别中的2种&#xff1a;大写字母、小写字母、数字、特殊符号 必选 满足 系统应具备对口令强度检测的能力&#xff0c;并对用户进行提示&#xff08;尽量不要…

odoo10 继承(扩展)、模块数据

一&#xff1a;继承 在不改变底层对象的时候添加新的功能——这是通过继承机制来实现的&#xff0c;作为在现有对象之上的修改层&#xff0c;这些修改可以发生在所有级别&#xff1a;模型&#xff0c;视图和业务逻辑。不是直接修改现有模块&#xff0c;而是创建一个新模块以添加…

做一个vue的todolist列表

<template><div id"app"><input type"text" v-model"todo" ref"ip"/><button click"add()">新增</button><br/><br/><hr/><ul><li v-for"(item,key) in li…

hadoop+hive-0.10.0完全分布式安装方法

hadoophive-0.10.0完全分布式安装方法 1、jdk版本&#xff1a;jdk-7u60-linux-x64.tar.gz http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260.html 2、hive版本&#xff1a;hive-0.10.0.tar.gz https://archive.apache.org/dist/hive/hive-0…

关于gitgithub的操作

先马克&#xff0c;回头细看&#xff0c;然后整理一下 https://linux.cn/article-4292-1.html转载于:https://www.cnblogs.com/mengjie1001/p/10076530.html