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的新手,所以它可能不是“正确”的做事方式。我非常感谢所有能够指出是否有更好的方式去实现这一结果
我通常倾向于认为查找表比任何类型的运行时条件评估都快。这[SO线程](http://stackoverflow.com/questions/9928221/table-of-functions-vs-switch-in-golang)似乎支持这一假设。除了我所有的代码都是由脚本发出的,不是手写的,而且它发出的查询表更清晰/更高效。 – DroidOS
@DroidOS,你提到的线程是从2012年开始的。最新的Go编译器可能会生成更快的代码。例如。 https://github.com/golang/go/commit/4bc9badd759f863f784e5f8d105a25c615324359如果表现真的很重要,我会建议你基准两种不同的方法。 – kostya
@DroidOS,如果代码是自动生成的,除了Go编译器,没有人会看它,而不是我认为它是否符合惯用并不重要。尽可能提高效率。以stringer输出为例(http://blog.golang.org/generate)。 – kostya