`
knight_black_bob
  • 浏览: 822962 次
  • 性别: 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
分享到:
评论

相关推荐

    go语言中文教程及手册.pdf

    go语言中文教程及手册. Go 编程语言是一个使得程序员更加有效率的开源项目。Go 是有表达力、简洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新ᓆ的类型系统允许构建有ᧄ性的模块化程序。Go编译...

    学习 Go 语言(Golang)

    学习 Go 语言(Golang),简单易懂的Go语言教程,让你分分钟学会GO语言

    Go语言圣经,golang学习入门到精通

    Go语言有时候被描述为“C类似语言”,或者是“21世纪的C语言”... Go语言有足够的类型系统以避免动态语言中那些粗心的类型错误,但是Go语言的类型系统相比传统的强 类型语言又要简洁很多。虽然有时候这会导致一个“无类

    golang GO语言开发工具

    golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO...

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

    主要介绍了详解Golang利用反射reflect动态调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Go语言15套教程(百度网盘)

    04 Go语言实战开发一个WEB项目博客系统05 Go语言深度讲解(推荐 2018年1月更新)06 Go语言快速入门(2018年2月更新)07 Go语言协程流量统计(2018年3月更新)08 Go语言入门到实战视频教程(2018年3月更新)09 Go语言...

    golang语言,window系统下安装go语言包

    中下载适合你系统的Go语言包,选择 .msi 安装包下载即可。 安装 Go 语言包 双击下载的安装包,按照提示进行安装。 配置环境变量 在环境变量中添加 Go 语言的路径,如 C:\Go\bin。这样,你就可以在任意目录下运行 ...

    Go语言学习笔记.pdf 共174页

    Go语言学习笔记.pdf 共174页

    go语言编程,Go语言程序设计(英文版),学习 Go 语言(Golang),golang-china读书笔记

    go语言编程,Go语言程序设计(英文版),学习 Go 语言(Golang),golang-china读书笔记

    Go语言核心编程.pdf

    Go语言核心编程.

    Go语言从入门到精通课件PPT

    第1章_Go语言简介 第2章_开发环境准备 第3章_Go语言快速入门 第4章_Go语言的基本语法与开发基础 第5章_用Go语言进行数学、科学领域的计算 第6章_用Go语言开发1个命令行工具 ...第18章_Go语言与其他语言的结合运用

    学习 Go 语言(Golang)_go语言_Go_

    学习GO语言,开启GO语言的学习,让你精通GO语言

    go语言入门精通全资料

    Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易 Go 是由 Google 的一个团队与一些开源社区的 贡献者 一同开发的开源项目。 Go 编程语言是一个开源项目,它使程序员更具生产力。 Go 语言具有很...

    go语言中文手册,标准库手册,教程,圣经打包下载(更新)

    html格式,带全文搜索. 在学习go的过程中需要查询各种资料和书籍 手册. 由于 studygolang.com/ go中文网经常不能访问(或者访问比较慢) 所以收集了 studygolang.com 上面推荐的...Go 语言(Golang).pdf 学习go语言.pdf

    Go语言相关资源:go语言程序设计、go语言圣经、golang Web开发、学习go语言(PDF&mobi;格式)

    go语言学习的相关资源,有pdf格式和kindle专用格式mobi,资料包含:go语言程序设计、学习Go语言(Golang)、Go语言圣经、Go语言实战、golang Web开发

    Go语言实战 中文高清带目录

    Go语言实战 中文高清带目录。 本书是国外 Go 社区多年经验积累的成果。本书默认读者已经具有一定的编程基础,希望更 好地使用 Go 语言。全书以示例为基础,详细介绍了 Go 语言中的一些比较深入的话题。对于有经 验的...

    Go语言中文文档,2019最新

    Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效 率。 Go语言语法灵活、简洁、清晰、高效。它对的并发特性可以方便地用于多核 处理器 和网络开发,同时灵活新颖的类型系统可以方便地编写模块...

    【文件夹】Go语言并发之道.pdf

    你将理解 Go语言为何选定这些并发模型,这些模型又会带来什么问题,以及你如何组合利用这些模型中的原语去解决问题。学习那些让你在独立且自信的编写与实现任何规模并发系统时所需要用到的技巧和工具。 理解Go语言...

    Go语言底层原理剖析.pdf

    Go语言底层原理剖析.pdf

    Go语言程序设计 epub

    书中从如何获取和安装Go语言环境,以及如何建立和运行Go程序开始,逐步介绍了Go语言的语法、特性以及一些标准库,内置数据类型、语句和控制结构,然后讲解了如何在Go语言中进行面向对象编程,Go语言的并发特性,如何...

Global site tag (gtag.js) - Google Analytics