在golang中使用全局变量

ste*_*iss 4 rest go

我有一个全局变量,我试图在两个不同的函数中使用,并且无法弄清楚为什么以下代码不起作用...

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()

}
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用...... HTTP服务器不会将请求路由到hostLookup函数.

但是 - 如果我从bar()移动以下行

log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
Run Code Online (Sandbox Code Playgroud)

到函数foo()的末尾,然后它正常工作

我究竟做错了什么?

sbe*_*rry 11

你的问题有两个......

首先,你宣布

var api rest.Api
Run Code Online (Sandbox Code Playgroud)

但是rest.New()返回一个*rest.Api

func NewApi() *Api {
Run Code Online (Sandbox Code Playgroud)

其次,在您的foo()函数中,您正在创建一个名为api而不是使用包变量的局部变量.

代替

api := rest.NewApi()
Run Code Online (Sandbox Code Playgroud)

它应该是

api = rest.NewApi()
Run Code Online (Sandbox Code Playgroud)

所以,修复是添加一个*before rest.Apiin var api *rest.Api和从api的设置中删除冒号,如api = rest.NewApi()