go 语言中的 类注册 与 反射问题
go 语言中 并不能像java 一样直接通过 class.forname 的方式找到已经加载 classload 中的类, 为了像java web 一样 有一个dispactherservlet 并在调用的时候 反射到自己的方法上, 必须要实例化一个 controller 对象,获取该对象的类型
第一种方法
在 全局定义 Application 并写入主要放射类名 作为属性列表
注册 controller
type Application struct {
UserController UserController
PersonController PersonController
HealthController HealthController
}
注册 dispacther servlet 调用
type BlackHoleServlet struct {
}
func (BlackHoleServlet) DoReq(api string, obj *ReqObj.ReqObj) (string, bool) {
var ret string
var isTrue bool = false
serviceCode, _ := UrlUtil.GetServiceCode(api)
apiGroupCode, _ := UrlUtil.GetApiGroupCode(api)
apiCode, _ := UrlUtil.GetApiCode(api)
apiVersion, _ := UrlUtil.GetApiVersion(api)
fmt.Println(serviceCode, apiGroupCode, apiCode, apiVersion)
fmt.Println(obj)
requestMain := RequestMain.InitRequestMain(apiGroupCode, apiCode, apiVersion, obj)
fmt.Println("=========")
if !Params.IsSucc(requestMain.Params) {
//respObj := RespObj.RespObj{
// Resp: &RespObj.Response{Code: requestMain.Params.Code,Msg: requestMain.Params.Msg ,
// Subcode: requestMain.Params.Subcode ,Submsg: requestMain.Params.Submsg },Data: "",M0: nil}
respObj := RespObj.SetErrData(requestMain.Params.Code, requestMain.Params.Msg, requestMain.Params.Subcode, requestMain.Params.Submsg)
return RespObj.ToString(&respObj), false
}
var pool Application.Application
//获取结构体实例的反射类型对象
typeOfPool := reflect.TypeOf(pool)
fmt.Println(typeOfPool)
for i := 0; i < typeOfPool.NumField(); i++ {
fieldType := typeOfPool.Field(i)
fmt.Printf("name: %v tag: '%v'\n", fieldType.Name, fieldType.Tag)
}
fmt.Println("----", apiGroupCode)
//获取内部变量
typeController, ok := typeOfPool.FieldByName(apiGroupCode)
if !ok {
respObj := RespObj.SetErrData(Constants.RESPONSE_504_TXT, Constants.RESPONSE_504_TXT, Constants.RESPONSE_DETAIL_504_0001_CODE, Constants.RESPONSE_DETAIL_504_0001_TEXT+"[token]")
return RespObj.ToString(&respObj), false
}
mbp := requestMain.Params.BizParam
paramList := []reflect.Value{}
for _, valPro := range mbp {
paramList = append(paramList, reflect.ValueOf(valPro))
}
Try.Try(func() {
new := reflect.New(typeController.Type)
fmt.Println("=== new ===", (&new))
method1 := (&new).MethodByName(apiCode)
ret = method1.Call(paramList)[0].String()
isTrue = true
}).Catch("", func(e interface{}) {
respObj := RespObj.SetErrData(Constants.RESPONSE_505_TXT, Constants.RESPONSE_505_TXT, Constants.RESPONSE_DETAIL_505_0001_CODE, Constants.RESPONSE_DETAIL_505_0001_TEXT)
ret = RespObj.ToString(&respObj)
}).Finally(func() {
})
return ret, isTrue
}
第二种方法
在 设置一个类工厂池,
设置一个controller 对象池
package ApplicationPool
var Pool map[string] interface{} = make(map[string] interface{})
注册controller
package Controller
import (
"curiousby/Entity/RespObj"
"fmt"
"main/ApplicationPool"
)
func init() {
ApplicationPool.Pool["HealthController"] = HealthController{}
}
type HealthController struct {
}
注册 dispacther servlet 调用
func (WormholeServlet) DoReq(api string, obj *ReqObj.ReqObj) (string, bool) {
var ret string
var isTrue bool = false
serviceCode, _ := UrlUtil.GetServiceCode(api)
apiGroupCode, _ := UrlUtil.GetApiGroupCode(api)
apiCode, _ := UrlUtil.GetApiCode(api)
apiVersion, _ := UrlUtil.GetApiVersion(api)
fmt.Println(serviceCode, apiGroupCode, apiCode, apiVersion)
fmt.Println(obj)
requestMain := RequestMain.InitRequestMain(apiGroupCode, apiCode, apiVersion, obj)
fmt.Println("=========")
if !Params.IsSucc(requestMain.Params) {
respObj := RespObj.SetErrData(requestMain.Params.Code, requestMain.Params.Msg, requestMain.Params.Subcode, requestMain.Params.Submsg)
return RespObj.ToString(&respObj), false
}
typeController := ApplicationPool.Pool[apiGroupCode]
if typeController == nil {
respObj := RespObj.SetErrData(Constants.RESPONSE_504_TXT, Constants.RESPONSE_504_TXT, Constants.RESPONSE_DETAIL_504_0001_CODE, Constants.RESPONSE_DETAIL_504_0001_TEXT+"[token]")
return RespObj.ToString(&respObj), false
}
mbp := requestMain.Params.BizParam
paramList := []reflect.Value{}
for _, valPro := range mbp {
paramList = append(paramList, reflect.ValueOf(valPro))
}
Try.Try(func() {
t := reflect.TypeOf(typeController);
new := reflect.New(t)
fmt.Println("=== new ===", (&new))
method1 := (&new).MethodByName(apiCode)
ret = method1.Call(paramList)[0].String()
isTrue = true
}).Catch("", func(e interface{}) {
respObj := RespObj.SetErrData(Constants.RESPONSE_505_TXT, Constants.RESPONSE_505_TXT, Constants.RESPONSE_DETAIL_505_0001_CODE, Constants.RESPONSE_DETAIL_505_0001_TEXT)
ret = RespObj.ToString(&respObj)
}).Finally(func() {
})
return ret, isTrue
}
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。
个人主页:http://knight-black-bob.iteye.com/
谢谢您的赞助,我会做的更好!
相关推荐
本文将详细介绍如何在 Go 语言中利用反射来动态调用方法,通过具体的代码示例,帮助读者深入理解这一概念。 #### 二、反射的基本概念 在计算机科学中,“反射”通常指的是程序可以在运行时访问、检测甚至修改其...
Go-dig是一个强大的依赖注入工具包,专门为Go语言设计,利用了Go的反射(reflection)特性,使得在构建复杂的应用程序时,可以更加方便地管理对象间的依赖关系。依赖注入是一种设计模式,它有助于提高代码的可测试性、...
在《Go语言博客实践》这本书中,作者喻恒春探讨了使用Go语言开发博客系统的过程,特别是选择了Martini框架作为基础。Martini是一个轻量级的Web应用框架,它的核心特性是依赖注入,这有助于降低组件间的耦合度。依赖...
在Golang(也称为Go语言)的开发过程中,有许多实用的工具和组件,它们极大地提升了开发效率和代码质量。本文将深入探讨其中的一些关键工具和组件,并解释它们如何与Go语言的特性相结合,以实现高效的编程。 1. **...
在Go语言中,protobuf提供了一种高效且灵活的方式来处理结构化数据,而基于反射的实现则增加了更多元化的功能。 ### 1. 什么是反射 反射是编程语言中的一个高级特性,允许程序在运行时检查和修改自身的行为。在Go...
《Go语言实战:驾考系统》是一门针对Go语言初学者和进阶者的教程,旨在帮助学习者从零开始,...通过这个课程,学员不仅能够掌握Go语言的基础和进阶知识,还能学会如何利用这些知识解决实际问题,提升自己的编程技能。
在本文中,我们将深入探讨Go语言,一个由Google开发的静态类型、编译型、并发型、垃圾回收的编程语言。"go-training"项目提供了一个全面的学习资源,涵盖了Go语言的基础到进阶特性,包括基本语法、指针、数组、切片...
在本项目中,我们关注的是一个使用Go语言(Golang)编写的轻量级推送系统。这个系统的设计和实现充分体现了Go语言的并发优势和高效性能,为移动应用或者Web应用提供实时的消息推送服务。Go语言以其简洁的语法、强大...
在Go语言中,JSON处理是常见的任务,而`jsoniter`库因其高效的性能和易用性,成为开发者处理JSON数据的热门选择。标题中的“Go-jsoniterator(jsoniter)-速度比DOM快比SAX或StAX更有用”揭示了`jsoniter`的核心优势:...
`Go-Dargs`的工作原理基于Go语言的反射(reflection)和命令行解析库。它首先解析命令行输入,然后对每个参数进行检查,如果匹配到预定义的转换器,就会调用相应的转换函数。对于自动补全,`Go-Dargs`利用了Shell的...
1. **Go语言特性与微服务**: - **简洁性**:Go语言的语法简单明了,易于学习和阅读,这使得开发微服务时的代码更易维护。 - **高性能**:Go是编译型语言,运行速度快,内存管理高效,适合处理高并发场景,满足...
gRPC与Protobuf是现代微服务架构中常用的技术栈,尤其在Golang开发中占据着重要地位。本文将深入探讨这两个概念以及它们在实际应用中的优势。 首先,RPC(Remote Procedure Call)是一种让程序可以在分布式环境中像...
在Golang中,由于语言特性,我们不能像Java那样动态创建对象。因此,我们需要手动注册Controller和它们对应的方法。这里我们定义了一个名为`routes`的map,用于存储Controller的指针。当请求到来时,我们解析URL中的...
- 在Go语言中,由于其内置的反射(reflection)功能,实现依赖注入相对容易,但可能会带来性能损失。Goldi巧妙地平衡了这一点,实现了高效的依赖注入。 2. **Goldi的工作原理** - Goldi通过定义接口(Interface)...
在Go语言中实现一个简单的RPC框架,主要涉及以下几个关键点: 1. **服务端设计**: - **函数映射**:服务端需要维护一个映射表,将接收到的函数名映射到实际的函数执行体。这通常通过`map[string]reflect.Value`...
通过阅读源码,你可以学习到Go语言的面向接口编程、反射机制以及如何编写高效的Go代码。 此外,如果你是一个Golang开发者,将GODI集成到你的项目中可以提升你的开发效率,使得你的代码更易于理解和维护。通过实践和...
在这个"di-demo"项目中,容器是基于反射机制实现的,这是一种强大的Go语言特性,允许在运行时检查和修改程序的结构。 首先,让我们了解"注册/获取依赖"这一功能。在DI容器中,开发者可以注册各种依赖,这些依赖可能...
在Java中,Spring框架是一个典型的依赖注入容器,而在Golang中,由于语言特性,我们需要手动创建对象后再注入。 首先,我们创建一个`Container`结构体,它包含两个映射:`singletons`用于存储单例对象,`factories`...
Go语言的设计目标是提高开发者的生产力和代码运行效率,特别适合构建网络服务和高性能的后台系统。使用Go语言编写Web服务器非常常见,因为其内置的net/http库提供了简洁而强大的API来处理HTTP请求。 在压缩包文件...