使用正确的返回类型

时间:2018-01-20 04:59:00

标签: json go

我正在使用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, &quotes)

    if e != nil {
        log.Fatal(e)
    }

    return quotes
}

我的问题是:如果我收到错误,例如"您要求的数据不可用",如何从{{1}正确返回正确的类型}吗

如果我使用GetQuotes解组,我可以使用开关选择正确的结构,例如json.RawMessageQuote,但是,我无法从{{{I}设置正确的返回类型1}}

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, &quotes)

    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函数可以返回FooBar结构。