我正在使用JSON API来提取外汇报价。
我正在解散struct
这样的事情:
type Quote struct {
Symbol string
Bid float32
Ask float32
Price float32
Timestamp int
}
像这样使用function
:
func GetQuotes(symbols []string, api_key string) []Quote {
result := fetch("quotes?pairs=" + strings.Join(symbols, ","), api_key)
quotes := []Quote{}
e := json.Unmarshal(result, "es)
if e != nil {
log.Fatal(e)
}
return quotes
}
我的问题是:如果我收到错误,例如"您要求的数据不可用",如何从{{1}正确返回正确的类型}吗
如果我使用GetQuotes
解组,我可以使用开关选择正确的结构,例如json.RawMessage
或Quote
,但是,我无法从{{{I}设置正确的返回类型1}}
答案 0 :(得分:5)
我建议你按照Go方式,并返回错误和引号,这是一个例子:
func GetQuotes(symbols []string, api_key string) ([]Quote, error) {
quotes := []Quote{}
// A better would be if the fetch
// fuction also returns both
// result and error
result := fetch("quotes?pairs=" + strings.Join(symbols, ","), api_key)
e := json.Unmarshal(result, "es)
if e != nil {
return quotes, e
}
return quotes, nil
}
现在您可以检查请求或编组是否返回错误。
quotes, err := GetQuotes(symbols, apiKey)
if err != nil {
// handle errors here
}
您还可以返回ErrorMessage
类型的自定义结构,而不是error
。
<子> Error handling and Go 子>
为了返回不同的类型,你必须在return语句中使用一个接口,这里是example:
package main
import (
"fmt"
)
type Foo struct {}
type Bar struct {}
func Baz(w string) interface{} {
if w == "Foo" {
return Foo{}
}
return Bar{}
}
func main() {
fmt.Printf("%T", Baz("Bar"))
}
=> main.Bar
Baz
函数可以返回Foo
和Bar
结构。