从Go中的接口访问数据

时间:2017-01-15 19:30:05

标签: api go quandl

我正在尝试在Golang中实现一个简单的api。我在后端的经验更多的是使用python和node,因此我在打印接口中保存的数据时遇到了一些困难,因为它不允许我对其进行索引。我已经搜索过,当界面是一个值时,有几个人问了类似的问题,但是当界面是slice时我不相信([] interface {})。我试过vaping界面无济于事。

当我将浏览器指向/quandl/ddd/10时,我想fmt.Println具体的数字数据,即(" 2017-01-13", 15.67, 16.41, 15.67, 16.11, 3595248, 0, 1, 15.67, 16.41, 15.67, 16.11, 3595248 ])

 package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"

    "github.com/fatih/color"
    "github.com/gorilla/mux"
)

type QuandlResponse struct {
    SourceCode string      `json:"source_code"`
    SourceName string      `json:"source_name"`
    Code       string      `json:"code"`
    Frequency  string      `json:"frequency"`
    FromDate   string      `json:"from_date"`
    ToDate     string      `json:"to_date"`
    Columns    []string    `json:"column_names"`
    Data       interface{} `json:"data"`
}

func getContent(w http.ResponseWriter, r *http.Request) {
    stock := mux.Vars(r)["stock"]
    limit := mux.Vars(r)["limit"]
    url := "https://www.quandl.com/api/v1/datasets/WIKI/" + url.QueryEscape(stock) + ".json?&limit=" + url.QueryEscape(limit) + "&auth_token=XXXXX"
    response, err := http.Get(url)
    if err != nil {
        fmt.Println(err)
    }
    contents, err := ioutil.ReadAll(response.Body)
    var result QuandlResponse
    json.Unmarshal(contents, &result)
    json.NewEncoder(w).Encode(result)
    fmt.Println(result.Data[0]) 


}
    func callAll() {
        rabbit := mux.NewRouter()
        rabbit.HandleFunc("/quandl/{stock}/{limit}", getContent)
        http.ListenAndServe(":8000", rabbit)
    }

func main() {
    color.Blue("Running Server @localhost:8000")
    callAll()

}

1 个答案:

答案 0 :(得分:1)

如果你知道Data的类型是[]interface{},你可以做一个类型断言:

slice := result.Data.([]interface{})
fmt.Println(slice[0])

如果Data类型有多种可能,您可以使用类型开关:

switch data := result.Data.(type) {
case []interface{}:
    fmt.Println(data[0])
case string:
    fmt.Println(data)
default:
    // unexpected type
}

如果您的要求更复杂,您可能还需要查看reflect包。