Go 使用接口获取结构的值

Go 使用接口获取结构的值,go,struct,request,Go,Struct,Request,我正试图解析这个请愿书() 我在为它创建结构时遇到了很多问题,所以我使用了一个自动化工具,我的结构是这样的: type orderBook struct { Bids [][]interface{} `json:"Bids"` Asks [][]interface{} `json:"Asks"` } 我通过以下操作恢复并解析请愿书: url := "https://www.binance.com/api/v1/depth?symbol=MDABT

我正试图解析这个请愿书()

我在为它创建结构时遇到了很多问题,所以我使用了一个自动化工具,我的结构是这样的:

type orderBook struct {
    Bids         [][]interface{} `json:"Bids"`
    Asks         [][]interface{} `json:"Asks"`
}
我通过以下操作恢复并解析请愿书:

url := "https://www.binance.com/api/v1/depth?symbol=MDABTC&limit=500"
resp, err := http.Get(url)
if err != nil {
    panic(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    panic(err)
}else{
    book := orderBook{}
if err := json.Unmarshal(body, &book); err != nil {
    panic(err)
}
但每当我尝试使用struct进行操作时,例如:

 v := book.Asks[i][0] * book.Asks[i][1]
我得到一个错误:

无效操作:book.Asks[i][0]*book.Asks[i][1](运算符*非 在接口上定义)

我如何定义它?我是否需要为
出价/要求
创建一个结构,如果需要,会是什么样子

抱歉,如果这看起来很基本,我刚开始学习go。

在Golang

对于接口类型为x的表达式和类型为T的表达式,主 表情

断言x不是nil,并且存储在x中的值是T类型。 符号x.(T)称为类型断言

从接口获取字符串类型的基础值时,需要将assert类型设置为string

books.Asks[0][0].(string)
要对同一个字符串执行算术运算,需要将字符串转换为float64以考虑十进制值

v := strconv.ParseFloat(books.Asks[0][0].(string), 64) * strconv.ParseFloat(books.Asks[0][1].(string), 64)

签出上的代码请注意,您可以通过实现

例如():

因此,对这些文档进行解组看起来很惯用:

func main() {
  book := OrderBook{}
  err := json.Unmarshal([]byte(jsonstr), &book)
  if err != nil {
    panic(err)
  }
  fmt.Printf("Asks:   %#v\n", book.Asks)
  fmt.Printf("Bids:   %#v\n", book.Bids)
  fmt.Printf("Update: %#v\n", book.LastUpdateId)
  // Asks:   []main.Order{main.Order{Price:0.00013186, Volume:167}, main.Order{Price:0.00013187, Volume:128}, ...
  // Bids:   []main.Order{main.Order{Price:0.00013181, Volume:110}, main.Order{Price:0.00013127, Volume:502}, ...
  // Update: 14069188
}

你无法定义它。你只能乘数字。这里您试图将两个
interface{}
s相乘。如果您知道它们将是,比如说,
float
s,那么应该将其定义为类型,而不是
interface{}
。如果您不这样做,那么在您证明(通过类型断言)它们是数字之前,您不能将它们相乘。就是这样,非常感谢:)@Adrian它们需要是字符串,我做到了,但当我尝试使用float64()强制转换它们时,我发现此错误无法转换book。请[I][0](类型字符串)键入float64,我遗漏了什么?因为接口的基础值是float64,默认情况下这是unmarshal json具有整数值的情况下的值。在指定的字段中,但您没有获得第二个参数,strconv.ParseFloat失败(asks1,err:=strconv.ParseFloat(books.Asks[0][0](string),64))我使用常量进行简化,而不是循环获取id值。如果你想循环到id,你可以通过数据片进行循环。我已经编辑了在接口片上循环的代码,以获取基于id的数据。请随时查看
type OrderBook struct {
  Asks, Bids   []Order
  LastUpdateId int
}

type Order struct {
  Price, Volume float64
}

func (o *Order) UnmarshalJSON(bs []byte) error {
  values := make([]interface{}, 0, 3)
  err := json.Unmarshal(bs, &values)
  if err != nil {
    return err
  }
  // TODO: more error checking re: len(values), and their types.
  price, err := strconv.ParseFloat(values[0].(string), 10)
  if err != nil {
    return err
  }
  volume, err := strconv.ParseFloat(values[1].(string), 10)
  if err != nil {
    return err
  }
  *o = Order{price, volume}
  return nil
}
func main() {
  book := OrderBook{}
  err := json.Unmarshal([]byte(jsonstr), &book)
  if err != nil {
    panic(err)
  }
  fmt.Printf("Asks:   %#v\n", book.Asks)
  fmt.Printf("Bids:   %#v\n", book.Bids)
  fmt.Printf("Update: %#v\n", book.LastUpdateId)
  // Asks:   []main.Order{main.Order{Price:0.00013186, Volume:167}, main.Order{Price:0.00013187, Volume:128}, ...
  // Bids:   []main.Order{main.Order{Price:0.00013181, Volume:110}, main.Order{Price:0.00013127, Volume:502}, ...
  // Update: 14069188
}