英文:
Google GO: routing request handling mystical declarations?
问题
我第一次使用Google GO玩耍。我已经扩展了“hello world”应用程序,尝试在init部分中定义路径。到目前为止,我已经做了以下工作:
package hello
import (
"fmt"
"net/http"
)
func init() {
http.HandleFunc("/service", serviceHandler)
http.HandleFunc("/site", siteHandler)
http.HandleFunc("/", handler)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, there")
}
func serviceHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "this is Services")
}
func siteHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "this is Sites")
}
只有handler()
回调函数被执行,其他函数被忽略。例如:http://myserver/service/foo
打印出Hello, there
。我希望它应该是this is Services
。
有没有更好的方法来进行服务路由?理想情况下,我希望它们是单独的脚本,但看起来Go只有一个脚本,因为app.yaml在脚本声明中需要一个特殊的字符串_go_app
。
谢谢!
英文:
I'm dorking around with Google GO for the first time. I've extended the "hello world" application to try to have paths defined in the init section. Here's what I've done so far:
package hello
import (
"fmt"
"net/http"
)
func init() {
http.HandleFunc("/service", serviceHandler)
http.HandleFunc("/site", siteHandler)
http.HandleFunc("/", handler)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, there")
}
func serviceHandler( w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "this is Services")
}
func siteHandler( w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "this is Sites")
}
Only the handler()
callback is ever executed -- the others are ignored. E.g.: http://myserver/service/foo
prints Hello, there
. I had hoped that it would be this is Services
.
Is there a better way to do service routing? Ideally, I would expect these to be separate scripts anyway, but it looks like Go has only one script, based on the fact that the app.yaml requires a special string _go_app
in the script declaration.
Thanks!
答案1
得分: 6
根据http://golang.org/pkg/net/http/#ServeMux上的文档,没有尾部斜杠的路径规范只能精确匹配该路径。在末尾添加斜杠,像这样:http.HandleFunc("/service/", serviceHandler)
,它将按照您的期望工作。
英文:
According to the documentation at: http://golang.org/pkg/net/http/#ServeMux
path specs that do not have a trailing slash only match that path exactly. Add a slash to the end like so: http.HandleFunc("/service/", serviceHandler)
and it will work as you expect.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论