`

Go语言反射实现Http Url与Method映射

 
阅读更多

      最近使用Go语言,使用http server,做了一个简单Url到StructName/MethodName的简单映射。主要思路是将Url能够StructName/MethodName做个映射,只需在Struct中添加方法就可以添加了实现,比如localhost:9000\struct\a和localhost:9000\struct\b,若是struct需要添加可以定义新的Struct然后将新的Struct注册进去就可以。

核心代码:

type Server struct {
	allStruct map[string]*StructDefind
}

type StructDefind struct {
	name   string
	rvalue reflect.Value
	rtype  reflect.Type

	methods map[string]*Method
}

type Method struct {
	method     reflect.Method
	haveReturn bool
}

// construct method default
func NewServer() *Server {
	server := new(Server)
	server.allStruct = make(map[string]*StructDefind)

	return server
}

func (this *Server) Start(port string) error {
	return http.ListenAndServe(port, this)
}

func (this *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	//fmt.Fprintf(w, "Hello bs!")
	for _, s_define := range this.allStruct {
		for m_name, m := range s_define.methods {
			methodAccept := "/" + s_define.name + "/" + m_name
			if strings.EqualFold(methodAccept, r.URL.Path) {
				//fmt.Fprintln(w, "true")
				m.method.Func.Call([]reflect.Value{s_define.rvalue, reflect.ValueOf(w), reflect.ValueOf(r)})
			}
		}
	}
	//fmt.Fprintf(w, "finish")
}

func (this *Server) Register(object interface{}) error {
	register := new(StructDefind)
	register.methods = make(map[string]*Method)
	register.rvalue = reflect.ValueOf(object)
	register.rtype = reflect.TypeOf(object)
	register.name = reflect.Indirect(register.rvalue).Type().Name()
	if register.name == "" {
		return fmt.Errorf("no service name for type ")
	}
	for m := 0; m < register.rtype.NumMethod(); m++ {
		method := register.rtype.Method(m)
		mtype := method.Type
		mname := method.Name

		if mtype.NumIn() != 3 {
			return fmt.Errorf("method %s has wrong number of ins: %d", mname, mtype.NumIn())
		}
		for in := 0; in < mtype.NumIn(); in++ {
			fmt.Println(mtype.In(in))
		}
		reply := mtype.In(1)
		if reply.String() != "http.ResponseWriter" {
			return fmt.Errorf("%s argument type not exported: %s", mname, reply)
		}
		arg := mtype.In(2)
		if arg.String() != "*http.Request" {
			return fmt.Errorf("%s argument type not exported: %s", mname, arg)
		}
		register.methods[mname] = &Method{method, false}

	}
	this.allStruct[register.name] = register
	return nil
}

func (this *Server) AllInfo() {
	for _, s_define := range this.allStruct {
		for m_name := range s_define.methods {
			fmt.Println("struct name:" + s_define.name + " method name:" + m_name)
		}
	}
}

func Enter() {
	server := NewServer()
	fmt.Println(server.Register(new(common.Assert)))
	server.AllInfo()
	server.Start(":9000")
}

 一个Struct模型实例:

type Assert struct {
}


func (this *Assert) SayHello(w http.ResponseWriter, r *http.Request) {

	fmt.Fprintf(w, "Hello demo!")
}

 

 

查看结果:

 


 
 

 

  • 大小: 18.4 KB
分享到:
评论

相关推荐

    Spring简单URL映射例子

    在Spring MVC框架中,URL映射是连接前端请求与后端处理逻辑的关键步骤。这个"Spring简单URL映射例子"展示了如何配置并使用URL映射来处理HTTP GET请求,同时展示如何获取并处理GET方式传递的参数。让我们深入探讨这个...

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

    接口(interface)类型与反射** Go 语言中的接口类型是反射的核心概念之一。一个接口类型包含两个指针:一个指向变量的类型,另一个指向变量的值。这使得接口变量可以存储任何类型的值,并且可以通过反射来获取这些...

    反射和映射实例

    在Java编程语言中,反射和映射是两个重要的高级特性,它们为程序提供了强大的灵活性和动态性。反射机制允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。映射则通常指的是Java中...

    Java反射值Method

    在Java编程语言中,反射(Reflection)是一种强大的机制,它允许程序在运行时检查和修改其结构和行为。本文将深入探讨Java反射中的一个关键组件——`Method`,以及如何利用`Class`类的多种方法来获取和操作类的方法...

    go 语言实现 html 转 pdf

    在IT领域,Go语言(Golang)以其高效、简洁的语法和强大的并发处理能力而备受推崇。本篇文章将深入探讨如何使用Go语言实现HTML到PDF的转换,这在数据报告、电子文档生成等方面有着广泛的应用。 首先,我们需要理解...

    利用宏实现反射机制

    然而,有些编程语言并不直接支持反射,或者其内置的反射机制可能不够灵活,这时程序员可以借助宏来模拟实现反射。 标题中的"利用宏实现反射机制"指的是通过预处理器宏在C++或其他不直接支持反射的语言中构建类似的...

    c++实现反射demo

    然而,目前这一特性尚未被所有编译器广泛支持,所以对于需要在现有环境工作的项目,上述自定义的反射实现仍然有其价值。 总的来说,"C++实现反射demo"展示了如何利用C++的模板和宏技术,模拟出类似于其他语言中的...

    Go-Golang实现转发服务

    在IT行业中,Go语言(Golang)以其高效、简洁和并发特性受到了许多开发者的青睐,尤其是在构建网络服务方面。本文将深入探讨如何使用Go来实现一个转发服务,以帮助开发者理解Go语言在网络编程中的应用。 首先,让...

    图文详解go语言反射实现原理

    Go语言的反射机制是其强大的特性之一,它允许在运行时检查和操作程序中的类型和值。反射的实现主要依赖于`interface`和`unsafe.Pointer`。本文将深入探讨Go反射的实现原理,并通过实例来解释如何使用反射进行类型和...

    利用反射 实现一个自制的struts

    接下来,让我们探讨如何使用反射来实现Struts的拦截器。拦截器在Struts中扮演着重要的角色,它们在请求处理前后执行额外的任务,比如验证、日志记录或性能监控。在自制的Struts中,你可以创建一个接口,如`...

    java 反射 报错 no such method exception

    ### Java反射机制与NoSuchMethodException详解 在Java编程中,反射是一种强大的机制,允许程序在运行时检查和修改自身结构和行为。然而,当开发者尝试使用反射调用一个不存在的方法时,便会遇到`java.lang....

    java反射机制及Method.invoke解释

    Java 反射机制及 Method.invoke 解释 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的...

    [反射机制]简单实现ORM

    在本案例中,"简单实现ORM"是指通过反射机制来实现对象关系映射(Object-Relational Mapping),这是一种将数据库中的数据与Java对象之间建立映射关系的技术,使得开发者可以更方便地操作数据库。 ORM的主要目的是...

    手撕Go语言开发 新手必备

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。它的设计目标是简化并发编程,并提供高效的系统编程能力。"手撕Go语言"这个主题通常意味着从基础到进阶,逐步剖析Go...

    go语言基础.pptx

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。它的设计灵感来源于C语言,同时融合了多种现代编程思想,如面向对象、函数式编程和并发处理。Go语言以其简洁、高效...

    java反射实现javabean转json实例代码.docx

    ### Java反射机制实现JavaBean转JSON的详细解析 #### 一、引言 在现代软件开发过程中,数据格式转换是一项非常常见的任务。特别是在处理不同系统之间的数据交换时,JSON(JavaScript Object Notation)因其轻量级...

    java反射机制详解及Method.invoke解释.pdf

    Hibernate 框架使用 Java 反射机制来实现对象关系映射。 因此,了解 Java 反射机制对于 Java 开发者来说是非常重要的。通过学习 Java 反射机制,可以更好地理解 Java 语言的机理,并且可以更好地开发出高效、灵活...

    java解决405 - HTTP method GET is not supported by this URL

    2. **URL映射问题**:检查web.xml配置文件,确保Servlet的URL路径与你的请求匹配。如果不匹配,服务器将不知道如何处理请求,从而返回405错误。 3. **Filter拦截**:如果使用了过滤器(Filter),确保它们没有错误...

    java 解析xml类映射数据库 数据库操作 反射机制 源码

    其次,XML映射数据库是ORM(Object-Relational Mapping)的一种实现,目的是将XML配置文件中的数据结构与数据库表结构对应起来,常见的框架有Hibernate和MyBatis。在本程序集中,可能是使用XML配置文件定义了数据库...

Global site tag (gtag.js) - Google Analytics