`
knight_black_bob
  • 浏览: 852967 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

go 语言中的 类注册 与 反射问题

    博客分类:
  • go
阅读更多

 

 

 

 

 

 

 

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/



 
 
 谢谢您的赞助,我会做的更好!

 

 

2
0
分享到:
评论

相关推荐

    详解Golang利用反射reflect动态调用方法

    本文将详细介绍如何在 Go 语言中利用反射来动态调用方法,通过具体的代码示例,帮助读者深入理解这一概念。 #### 二、反射的基本概念 在计算机科学中,“反射”通常指的是程序可以在运行时访问、检测甚至修改其...

    Go-dig一个用于Go语言基于反射的依赖注入工具包

    Go-dig是一个强大的依赖注入工具包,专门为Go语言设计,利用了Go的反射(reflection)特性,使得在构建复杂的应用程序时,可以更加方便地管理对象间的依赖关系。依赖注入是一种设计模式,它有助于提高代码的可测试性、...

    Go语言博客实践1

    在《Go语言博客实践》这本书中,作者喻恒春探讨了使用Go语言开发博客系统的过程,特别是选择了Martini框架作为基础。Martini是一个轻量级的Web应用框架,它的核心特性是依赖注入,这有助于降低组件间的耦合度。依赖...

    Golang常用工具功能及组件。_Go_下载.zip

    在Golang(也称为Go语言)的开发过程中,有许多实用的工具和组件,它们极大地提升了开发效率和代码质量。本文将深入探讨其中的一些关键工具和组件,并解释它们如何与Go语言的特性相结合,以实现高效的编程。 1. **...

    protobuf:用于 Go 的基于反射的协议缓冲区

    在Go语言中,protobuf提供了一种高效且灵活的方式来处理结构化数据,而基于反射的实现则增加了更多元化的功能。 ### 1. 什么是反射 反射是编程语言中的一个高级特性,允许程序在运行时检查和修改自身的行为。在Go...

    桫哥-GOlang基础-Go语言实战:驾考系统

    《Go语言实战:驾考系统》是一门针对Go语言初学者和进阶者的教程,旨在帮助学习者从零开始,...通过这个课程,学员不仅能够掌握Go语言的基础和进阶知识,还能学会如何利用这些知识解决实际问题,提升自己的编程技能。

    go-training:go学习。包含基本语法,指针,数组,切片,集合,错误处理等,包含通过注册工厂模式,反射实现简易计算器功能

    在本文中,我们将深入探讨Go语言,一个由Google开发的静态类型、编译型、并发型、垃圾回收的编程语言。"go-training"项目提供了一个全面的学习资源,涵盖了Go语言的基础到进阶特性,包括基本语法、指针、数组、切片...

    纯Go实现的轻量级推送系统源码.zip

    在本项目中,我们关注的是一个使用Go语言(Golang)编写的轻量级推送系统。这个系统的设计和实现充分体现了Go语言的并发优势和高效性能,为移动应用或者Web应用提供实时的消息推送服务。Go语言以其简洁的语法、强大...

    Go-jsoniterator(jsoniter)-速度比DOM快比SAX或StAX更有用

    在Go语言中,JSON处理是常见的任务,而`jsoniter`库因其高效的性能和易用性,成为开发者处理JSON数据的热门选择。标题中的“Go-jsoniterator(jsoniter)-速度比DOM快比SAX或StAX更有用”揭示了`jsoniter`的核心优势:...

    Go-Dargs-使用动态参数增强任何命令

    `Go-Dargs`的工作原理基于Go语言的反射(reflection)和命令行解析库。它首先解析命令行输入,然后对每个参数进行检查,如果匹配到预定义的转换器,就会调用相应的转换函数。对于自动补全,`Go-Dargs`利用了Shell的...

    microservices-with-go:使用Go编程语言构建微服务

    1. **Go语言特性与微服务**: - **简洁性**:Go语言的语法简单明了,易于学习和阅读,这使得开发微服务时的代码更易维护。 - **高性能**:Go是编译型语言,运行速度快,内存管理高效,适合处理高并发场景,满足...

    golang 微服务之gRPC与Protobuf的使用

    gRPC与Protobuf是现代微服务架构中常用的技术栈,尤其在Golang开发中占据着重要地位。本文将深入探讨这两个概念以及它们在实际应用中的优势。 首先,RPC(Remote Procedure Call)是一种让程序可以在分布式环境中像...

    golang利用不到20行代码实现路由调度详解

    在Golang中,由于语言特性,我们不能像Java那样动态创建对象。因此,我们需要手动注册Controller和它们对应的方法。这里我们定义了一个名为`routes`的map,用于存储Controller的指针。当请求到来时,我们解析URL中的...

    开源项目-fgrosse-goldi.zip

    - 在Go语言中,由于其内置的反射(reflection)功能,实现依赖注入相对容易,但可能会带来性能损失。Goldi巧妙地平衡了这一点,实现了高效的依赖注入。 2. **Goldi的工作原理** - Goldi通过定义接口(Interface)...

    Go实现简易RPC框架的方法步骤

    在Go语言中实现一个简单的RPC框架,主要涉及以下几个关键点: 1. **服务端设计**: - **函数映射**:服务端需要维护一个映射表,将接收到的函数名映射到实际的函数执行体。这通常通过`map[string]reflect.Value`...

    开源项目-francoispqt-godi.zip

    通过阅读源码,你可以学习到Go语言的面向接口编程、反射机制以及如何编写高效的Go代码。 此外,如果你是一个Golang开发者,将GODI集成到你的项目中可以提升你的开发效率,使得你的代码更易于理解和维护。通过实践和...

    di-demo:去依赖注入演示

    在这个"di-demo"项目中,容器是基于反射机制实现的,这是一种强大的Go语言特性,允许在运行时检查和修改程序的结构。 首先,让我们了解"注册/获取依赖"这一功能。在DI容器中,开发者可以注册各种依赖,这些依赖可能...

    golang不到30行代码实现依赖注入的方法

    在Java中,Spring框架是一个典型的依赖注入容器,而在Golang中,由于语言特性,我们需要手动创建对象后再注入。 首先,我们创建一个`Container`结构体,它包含两个映射:`singletons`用于存储单例对象,`factories`...

    echo-request:用于响应请求的简单 Web 服务器。 用于测试 Web 请求

    Go语言的设计目标是提高开发者的生产力和代码运行效率,特别适合构建网络服务和高性能的后台系统。使用Go语言编写Web服务器非常常见,因为其内置的net/http库提供了简洁而强大的API来处理HTTP请求。 在压缩包文件...

Global site tag (gtag.js) - Google Analytics