2015-07-10 54 views
0

我需要为Golang Web服务器中的特定请求定义请求处理程序。目前我这样做的方式如下在Golang Web服务器中使用映射处理程序

package main 

import "net/http" 

type apiFunc func(rg string, w http.ResponseWriter, r *http.Request) 

func h1(rg string, w http.ResponseWriter, r *http.Request) { 
    w.Write([]byte("Bonjour")) 
} 

func h2(rg string, w http.ResponseWriter, r *http.Request) { 
    w.Write([]byte("Guten Tag!")) 
} 

func h3(rg string, w http.ResponseWriter, r *http.Request) { 
    w.Write([]byte("Good Morning!")) 
} 

type gHandlers map[string]apiFunc 

var handlers gHandlers 

func handleConnection(w http.ResponseWriter, r *http.Request) { 
    hh := r.URL.Query().Get("handler") 
    handlers[hh]("rg", w, r) 
} 

func main() { 
    handlers = make(map[string]apiFunc, 3) 
    handlers["h1"] = h1 
    handlers["h2"] = h2 
    handlers["h3"] = h3 
    http.HandleFunc("/", handleConnection) 
    http.ListenAndServe(":8080", nil) 
} 

这工作得很好。但是,我仍然是Golang的新手,所以它可能不是“正确”的做事方式。我非常感谢所有能够指出是否有更好的方式去实现这一结果

回答

0

如何在handleConnection中使用switch声明?

switch hh { 
case "h1": 
    h1("rg", w, r) 
case "h2": 
    h2("rg", w, r) 
case "h3": 
    h3("rg", w, r) 
default: 
    // return HTTP 400 here 
} 

的优点是:

  • 容易理解代码:
    • 没有apiFuncgHandlers类型
    • 无需浏览以了解路由逻辑周围的源代码,它都在一个地方
  • 更灵活:您可以调用具有不同参数的函数,并根据需要实施更复杂的路由规则。
+0

我通常倾向于认为查找表比任何类型的运行时条件评估都快。这[SO线程](http://stackoverflow.com/questions/9928221/table-of-functions-vs-switch-in-golang)似乎支持这一假设。除了我所有的代码都是由脚本发出的,不是手写的,而且它发出的查询表更清晰/更高效。 – DroidOS

+0

@DroidOS,你提到的线程是从2012年开始的。最新的Go编译器可能会生成更快的代码。例如。 https://github.com/golang/go/commit/4bc9badd759f863f784e5f8d105a25c615324359如果表现真的很重要,我会建议你基准两种不同的方法。 – kostya

+1

@DroidOS,如果代码是自动生成的,除了Go编译器,没有人会看它,而不是我认为它是否符合惯用并不重要。尽可能提高效率。以stringer输出为例(http://blog.golang.org/generate)。 – kostya

相关问题