Goalng 反射

2024-01-29 02:58
文章标签 反射 goalng

本文主要是介绍Goalng 反射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在学习Golang的反射时确实碰到了一些问题

定义了一个学生结构体

type Student struct {name string `json:"student_name"`age int	`json:"student_age"`
}

 

  • 首先,在之前学习Java时,反射可以暴力获取类的私有变量和方法,但是在Golang好像不是这样的

问题的首次发现是在通过反射获取方法并调用时,代码如下

func callFuncByReflect(stu *Student){val := reflect.ValueOf(stu)fmt.Println(val.NumMethod())val.Method(0).Call(nil)
}

这是要调用的方法

func (stu *Student) print(){fmt.Println("hello")
}

但是发现,私有方法并不可以调用,并且NumMethod的数量也是0,这时候就很奇怪为什么结构体的私有变量可以获取,而私有方法获取不到。

后来,在通过反射改变结构体中变量的值时就出现了问题

方法如下

func modifyStructByReflect(stu *Student,modKey string,modVal string){val := reflect.ValueOf(stu)val.Elem().FieldByName(modKey).SetString(modVal)}

程序报出了panic:reflect.Value.SetString using value obtained using unexported field

结构体Student中name是未导出字段,也就是私有字段,是不可以修改的

并且,如果要通过反射修改变量的值,就必须通过指针来修改,如果传入的是一个Student结构体的副本,就无法进行修改

原因就在于如果要修改,也是修改这个函数中stu(源Student变量的副本)中的值,并不会对原变量起作用,go的api中也有

相应的可修改的函数reflect.value.CanSet()

 

总结:

go中发射是无法操作私有变量和方法的,私有变量可以获取其值和字段名称但无法修改,私有方法则是没有办法获取到的,也无

法调用。

另外通过指针Value才能修改字段的值。

这篇关于Goalng 反射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/655549

相关文章

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

【反射知识点详解】

Java中的反射(Reflection)是一个非常强大的机制,它允许程序在运行时检查或修改类的行为。这种能力主要通过java.lang.reflect包中的类和接口来实现。 通过反射,Java程序可以动态地创建对象、调用方法、访问字段,以及获取类的各种信息(如构造器、方法、字段等)。 反射的用途 反射主要用于以下几种情况: 动态创建对象:通过类的Class对象动态地创建其实例。访问类的字段