为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
红糖糍粑 2023-01-03 14:12:54
我有这个微服务,可以为用户准备数据以通过 API 路径检索。但是,在用户可以得到请求的数据之前,我需要做一些数据处理。我是这样做的:我将带有数据的填充结构传递给两个函数以进行处理getDataOriginWeather()和getDataDestinationWeather(). 在这两个函数运行之后,API 服务器就可以供用户请求数据,也就是结构。问题是,用户正在拉取的结构包含通过这两个函数处理数据之前和之后的混合记录。结构的预期数据应该只是在通过两个函数传递后的数据。我正在将这个结构从一个包传递到另一个包。这是我的代码。// the struct I'm working with and that will eventually be get requested by users.package modelstype 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)        }
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

在“运行”功能中,您似乎是:

  • 不检查错误 - 我认为你应该。

  • 处理一个可变的全局变量——如果你不这样做,你的代码将更清晰,更容易测试和调试。

在 data.Run() 中处理结构后,如何将结构显式传递给处理后的数据的 handlers.getWeather()。我在这里使用指针提供了混合结果。

创建一个结构,其中包含处理呼叫所需的内容。为该结构实现 http.Handler。在设置服务器时使用它。

例子:

package main


import (

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

}


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信