我在使用Go的RESTful框架(称为sleepy)时有以下代码。

我可以在http://localhost:3000上成功启动该服务,但是当我尝试访问http://localhost:3000/temperature时,我希望我的SparkCore函数dht执行。

我正在使用Gobot.io Spark platform基于this example执行此功能,该功能已在自己的代码中实现。

问题在于代码没有超过gobot.Start()函数内部的Get()方法,因此我实际上无法返回result数据。

我正在设置data值,希望可以执行以下操作:

return 200, data, http.Header{"Content-type": {"application/json"}}

但是它永远不会因为gobot.Start()而被称为。

我是Go的新手,所以我们将不胜感激。
package main

import (
    "net/url"
    "net/http"
    "fmt"
    "github.com/dougblack/sleepy"
    "github.com/hybridgroup/gobot"
    "github.com/hybridgroup/gobot/platforms/spark"
)

var gbot = gobot.NewGobot()
var sparkCore = spark.NewSparkCoreAdaptor("spark", "device_id", "auth_token")

type Temperature struct {}
func (temperature Temperature) Get(values url.Values, headers http.Header) (int, interface{}, http.Header) {
    work := func() {
        if result, err := sparkCore.Function("dht", ""); err != nil {
            fmt.Println(err)
        } else {
            data := map[string]string{"Temperature": result}
            fmt.Println("result from \"dht\":", result)
        }
    }

    robot := gobot.NewRobot("spark",
        []gobot.Connection{sparkCore},
        work,
    )

    gbot.AddRobot(robot)
    gbot.Start()

    return 200, data, http.Header{"Content-type": {"application/json"}}
}

func main() {
    api := sleepy.NewAPI()

    temperatureResource := new(Temperature)
    api.AddResource(temperatureResource, "/temperature")

    fmt.Println("Listening on http://localhost:3000/")
    api.Start(3000)
}

最佳答案

gbot.Start()是一个阻止调用。

在这种情况下,您应该将其称为:

go gbot.Start()

这将在goroutine(思维线程)中启动它,然后让您的应用继续。

当您查看gobot example app时,它们不是在后台运行,因为它是主要功能。如果main在后台运行所有内容并且不等待任何内容,则该应用会立即退出,并且没有明显的效果。

09-26 00:11