我有一个全局变量,我试图在两个不同的函数中使用,并且无法弄清楚为什么以下代码不起作用...
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net"
"net/http"
)
type Message struct {
Body string
}
var api rest.Api
func hostLookup(w rest.ResponseWriter, req *rest.Request) {
ip, err := net.LookupIP(req.PathParam("host"))
if err != nil {
rest.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteJson(&ip)
}
func foo() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
router, err := rest.MakeRouter(
&rest.Route{"GET", "/lookup/#host", hostLookup},
)
if err != nil {
log.Fatal(err)
}
api.SetApp(router)
}
func bar() {
log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
}
func main() {
foo()
bar()
}
上面的代码不起作用...... HTTP服务器不会将请求路由到hostLookup函数。
然而 - 如果我从bar()移动以下行
log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
到函数foo()的末尾,然后它可以正常工作
我做错了什么?
答案 0 :(得分:11)
你的问题有两个......
首先,你宣布
var api rest.Api
但rest.New()返回* rest.Api
func NewApi() *Api {
其次,在您的foo()
函数中,您正在创建一个名为api
的局部变量,而不是使用您的包变量。
而不是
api := rest.NewApi()
应该是
api = rest.NewApi()
因此,修复方法是在*
rest.Api
之前添加var api *rest.Api
,并在api = rest.NewApi()