由于指针,结构中的持久数据出现问题。如何获取具有预期数据的结构的最新实例?

我有这个微服务,可以为用户准备数据以通过 API 路径检索。


但是,在用户可以得到请求的数据之前,我需要做一些数据处理。我是这样做的:


我将带有数据的填充结构传递给两个函数以进行处理getDataOriginWeather()和getDataDestinationWeather(). 在这两个函数运行之后,API 服务器就可以供用户请求数据,也就是结构。


问题是,用户正在拉取的结构包含通过这两个函数处理数据之前和之后的混合记录。


结构的预期数据应该只是在通过两个函数传递后的数据。


我正在将这个结构从一个包传递到另一个包。


这是我的代码。


// the struct I'm working with and that will eventually be get requested by users.

package models


type TravelItenaries struct {

    Origin                string

    Destination           string

    Flight_num            string

    Origin_latitude       string

    Origin_longitude      string

    Destination_latitude  string

    Destination_longitude string

    Coordinates_ori       string

    Coordinates_dest      string

    Temp_c_ori            string

    Temp_f_ori            string

    Temp_c_dest           string

    Temp_f_dest           string

    LastUpdated           string

}

这是我在将数据发送给用户之前处理数据的地方。


package data


// for brevity I have removed how I populated the struct. I do so by using a CSV file. 


func getDataOriginWeather() (travel *models.TravelItenaries, err error) {

    fmt.Println("Getting origin data from Weather API...")

    // construct url params for weather API calls.

    params := url.Values{

        "key": []string{"xxx"},

        "q":   []string{""},

    }


    // build URL for request

    u := &url.URL{

        Scheme: "https",

        Host:   "api.weatherapi.com",

        Path:   "/v1/current.json",


        // encode params for URL syntax

        RawQuery: params.Encode(),

    }


    client := &http.Client{}


    values := u.Query()

    var responseData models.OriginWeather

    for _, flight := range TravelItenaries {

        values.Set("q", flight.Coordinates_ori)

        u.RawQuery = values.Encode()

        req, err := http.NewRequest("GET", u.String(), nil)

        if err != nil {

            fmt.Println(err)

        }


红糖糍粑
浏览 50回答 1
1回答

慕森卡

在“运行”功能中,您似乎是:不检查错误 - 我认为你应该。处理一个可变的全局变量——如果你不这样做,你的代码将更清晰,更容易测试和调试。在 data.Run() 中处理结构后,如何将结构显式传递给处理后的数据的 handlers.getWeather()。我在这里使用指针提供了混合结果。创建一个结构,其中包含处理呼叫所需的内容。为该结构实现 http.Handler。在设置服务器时使用它。例子:package mainimport (    "encoding/json"    "log"    "net/http")type TravelHandler struct {    Data interface{} // the preloaded data you need to serve http}func (th TravelHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {    err := json.NewEncoder(w).Encode(th.Data)    if err != nil {        http.Error(w, "could not encode data", 500)    }}func createTravelHandler() *TravelHandler {    // populate travel handler    return &TravelHandler{}}func main() {    th := createTravelHandler() // no mutable global, return the handler from a function (or pipe it through several functions)    err := http.ListenAndServe("localhost:3000", th)    log.Println(err)}
打开App,查看更多内容
随时随地看视频慕课网APP