登录
首页 >  Golang >  Go问答

反射:按字符串构造

来源:Golang技术栈

时间:2023-04-08 09:43:28 303浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《反射:按字符串构造》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到golang等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

假设我有一个带有方法的结构:

package main

import (
    "fmt"
    "reflect"
)

type MyStruct struct {
}

func (a *MyStruct) AAction() {
    fmt.Println("Hello a")
}

现在,如果我想通过字符串调用方法“AAction”,我可以使用反射(这有效):

func main() {
    reflect.New(reflect.TypeOf(MyStruct{})).MethodByName("AAction").Call([]reflect.Value{})
}

问题是,我不想将 MyStruct{} 用作表达式,而是用作字符串。当然这是行不通的:

func main() {
    theStruct := "MyStruct"
    theAction := "AAction"
    reflect.New(reflect.TypeOf(theStruct)).MethodByName(theAction).Call([]reflect.Value{})
}

因为 reflect.Typeof(theStruct) 将是一个字符串。我尝试通读文档,可悲的是,我找不到任何非常有用的东西。

我发现了这个类似的问题:[Call a Struct and its Method by name in Go? ](https://stackoverflow.com/questions/8103617/call-a-struct-and-its-method-by- name-in-go)
在接受的问题下,OP问:

在我的情况下的问题是我不能声明 t 是类型 T,它必须是一些我如何可以通过 T 的名称声明类型 T 是字符串“T”

得到回答

[...] 我建议将名称与代码中某处的字符串“T”匹配 [...]

这并不能解决问题,因为我仍然需要在MyStruct{}某个地方打电话。

问题是:有没有办法通过将名称作为字符串来使用结构?(无需手动将结构的名称映射到结构)

使用的工作版本reflect.TypeOf(MyStruct{}): PlayGround
不工作版本,显然在字符串上调用该方法:PlayGround

正确答案

对不起,你不能。答案是:你 不能 。没有内置或预初始化的类型名称注册表。

要开始使用反射(reflect包),您需要一个值(所讨论的类型)。基于stringstring类型的名称),您无法获取该类型的值,因此您无法开始。

如果您只想通过string类型名称做您想做的事,您需要在做您想做的事之前建立自己的“注册表”。

好了,本文到此结束,带大家了解了《反射:按字符串构造》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>