Golang Go语言中 请问反射是不是必须要先有一个明确的结构体?

发布于 1周前 作者 sinazl 来自 Go语言

Golang Go语言中 请问反射是不是必须要先有一个明确的结构体?

今天看到 go 反射的时候,发现 所有的例子都是这样的

首先要有一个结构体

type  Demo struts {

}

func (demo Demo) CallFuncNoArgs (){

}

然后才可以用反射

var demo= &Demo {}

reflect.ValueOf(demo).MethodByName(“CallFuncNoArgs”).Call([]reflect.Value{})

发现这样限制非常大,如果 我想用反射 调用任意函数,怎么办? 比如

有这样一个字符串

var fucnName = "api.getList"

api 是 包名,getList 是函数名

这种情况,我想通过这个字符串 执行对应的函数,该怎么操作?


更多关于Golang Go语言中 请问反射是不是必须要先有一个明确的结构体?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

go<br>registry := map[string]func() interface{}{<br> "Demo": func() interface{} { return Demo{} },<br>}<br>reflect.ValueOf(registry["Demo"]()).MethodByName("CallFuncNoArgs").Call(nil)<br>

更多关于Golang Go语言中 请问反射是不是必须要先有一个明确的结构体?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html




非常感谢你的解答,

但是我看了一下,发现这种方式 只是把 [var demo= &Demo {}] 这句复杂化了一下,我是直接定义的,你是定义后放入 map ,然后从 map 取,没有从根本上解决问题。

不过我还是非常感谢你,谢谢。

go 并没有内置存储包、函数的全局 map ,你必须自己定义一个 map ,把你那些函数都存到 map 里面再配合 reflect 调用。。

额,好吧,谢谢

考虑一下用 plugin

go 编译完是 exe ,不能动态加载 class……

go 的运行时没有元数据。
你说的那种字符串动态调用得有元数据才能实现,一般这样的语言( Java 、c#等)非常容易反编译就是因为元数据的原因。

Go 有元数据,只是不公开给开发者而已。

在Golang(Go语言)中,反射(reflection)是一种强大的工具,它允许程序在运行时检查变量的类型、值以及操作这些变量。关于你的问题,反射是否必须要先有一个明确的结构体,答案并不完全是绝对的,但理解起来需要一些细致的分析。

首先,反射确实经常用于操作结构体(struct)类型的数据,因为结构体在Go中是一种复合数据类型,能够包含多种不同类型的字段。通过反射,你可以动态地访问和修改结构体的字段,这在某些场景下非常有用,比如实现序列化/反序列化、通用的配置解析等。

然而,反射并不局限于结构体。Go的反射包(reflect)提供了对几乎所有Go类型的支持,包括基本类型(如int、float64)、切片(slice)、映射(map)、通道(channel)等。这意味着你可以使用反射来检查和操作这些类型的变量,而无需事先定义一个明确的结构体。

总结来说,虽然反射在处理结构体时特别有用,但它并不依赖于结构体。你可以使用反射来操作Go中的任何类型。不过,需要注意的是,反射通常会比直接操作类型更慢,且代码可读性较差,因此在使用时应权衡其带来的灵活性和可能的性能开销。在实际开发中,反射更多是作为一种高级特性,在特定场景下使用。

回到顶部