最近使用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!") }
查看结果:
相关推荐
在Spring MVC框架中,URL映射是连接前端请求与后端处理逻辑的关键步骤。这个"Spring简单URL映射例子"展示了如何配置并使用URL映射来处理HTTP GET请求,同时展示如何获取并处理GET方式传递的参数。让我们深入探讨这个...
接口(interface)类型与反射** Go 语言中的接口类型是反射的核心概念之一。一个接口类型包含两个指针:一个指向变量的类型,另一个指向变量的值。这使得接口变量可以存储任何类型的值,并且可以通过反射来获取这些...
在Java编程语言中,反射和映射是两个重要的高级特性,它们为程序提供了强大的灵活性和动态性。反射机制允许程序在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。映射则通常指的是Java中...
在Java编程语言中,反射(Reflection)是一种强大的机制,它允许程序在运行时检查和修改其结构和行为。本文将深入探讨Java反射中的一个关键组件——`Method`,以及如何利用`Class`类的多种方法来获取和操作类的方法...
在IT领域,Go语言(Golang)以其高效、简洁的语法和强大的并发处理能力而备受推崇。本篇文章将深入探讨如何使用Go语言实现HTML到PDF的转换,这在数据报告、电子文档生成等方面有着广泛的应用。 首先,我们需要理解...
然而,有些编程语言并不直接支持反射,或者其内置的反射机制可能不够灵活,这时程序员可以借助宏来模拟实现反射。 标题中的"利用宏实现反射机制"指的是通过预处理器宏在C++或其他不直接支持反射的语言中构建类似的...
然而,目前这一特性尚未被所有编译器广泛支持,所以对于需要在现有环境工作的项目,上述自定义的反射实现仍然有其价值。 总的来说,"C++实现反射demo"展示了如何利用C++的模板和宏技术,模拟出类似于其他语言中的...
在IT行业中,Go语言(Golang)以其高效、简洁和并发特性受到了许多开发者的青睐,尤其是在构建网络服务方面。本文将深入探讨如何使用Go来实现一个转发服务,以帮助开发者理解Go语言在网络编程中的应用。 首先,让...
Go语言的反射机制是其强大的特性之一,它允许在运行时检查和操作程序中的类型和值。反射的实现主要依赖于`interface`和`unsafe.Pointer`。本文将深入探讨Go反射的实现原理,并通过实例来解释如何使用反射进行类型和...
接下来,让我们探讨如何使用反射来实现Struts的拦截器。拦截器在Struts中扮演着重要的角色,它们在请求处理前后执行额外的任务,比如验证、日志记录或性能监控。在自制的Struts中,你可以创建一个接口,如`...
### Java反射机制与NoSuchMethodException详解 在Java编程中,反射是一种强大的机制,允许程序在运行时检查和修改自身结构和行为。然而,当开发者尝试使用反射调用一个不存在的方法时,便会遇到`java.lang....
Java 反射机制及 Method.invoke 解释 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的...
在本案例中,"简单实现ORM"是指通过反射机制来实现对象关系映射(Object-Relational Mapping),这是一种将数据库中的数据与Java对象之间建立映射关系的技术,使得开发者可以更方便地操作数据库。 ORM的主要目的是...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。它的设计目标是简化并发编程,并提供高效的系统编程能力。"手撕Go语言"这个主题通常意味着从基础到进阶,逐步剖析Go...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。它的设计灵感来源于C语言,同时融合了多种现代编程思想,如面向对象、函数式编程和并发处理。Go语言以其简洁、高效...
### Java反射机制实现JavaBean转JSON的详细解析 #### 一、引言 在现代软件开发过程中,数据格式转换是一项非常常见的任务。特别是在处理不同系统之间的数据交换时,JSON(JavaScript Object Notation)因其轻量级...
Hibernate 框架使用 Java 反射机制来实现对象关系映射。 因此,了解 Java 反射机制对于 Java 开发者来说是非常重要的。通过学习 Java 反射机制,可以更好地理解 Java 语言的机理,并且可以更好地开发出高效、灵活...
2. **URL映射问题**:检查web.xml配置文件,确保Servlet的URL路径与你的请求匹配。如果不匹配,服务器将不知道如何处理请求,从而返回405错误。 3. **Filter拦截**:如果使用了过滤器(Filter),确保它们没有错误...
其次,XML映射数据库是ORM(Object-Relational Mapping)的一种实现,目的是将XML配置文件中的数据结构与数据库表结构对应起来,常见的框架有Hibernate和MyBatis。在本程序集中,可能是使用XML配置文件定义了数据库...