从Go中的接口访问数据

huangapple go评论149阅读模式
英文:

Accessing Data From Interfaces in Go

问题

我正在尝试在Golang中实现一个简单的API。由于我在后端方面更多地使用Python和Node,所以我在打印接口中的数据时遇到了一些困难,因为它不允许我对其进行索引。我已经搜索过了,有几个人在接口是一个值时提出了类似的问题,但是当接口是一个slice(即[]interface{})时,没有人提问。我尝试了对接口进行类型转换,但没有成功。

当我将浏览器指向/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()
}

希望对你有帮助!

英文:

I am trying to implement a simple api in Golang. My experience in the backend is more with python and node, so I am having some difficulty printing out data held within the interface since it won't allow me to index it. I have searched around and several people have asked similar questions when the interface is one value, but not when the interface is a slice, I believe ([]interface{}). I have tried vaping the interface to no avail.

When I point the browser to /quandl/ddd/10 I would like to fmt.Println the specific numerical data, i.e. ("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

得分: 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:
// 意外的类型
}

如果你的需求更加复杂,你也可以查看reflect包。

英文:

If you know that the type of Data is []interface{}, you can do a type assertion:

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

If there are several possibilities for the type of Data, you can use a type switch:

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

You may also want to look at the reflect package if your requirements are more complicated.

huangapple
  • 本文由 发表于 2017年1月16日 03:30:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/41665383.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定