一尘不染

将 interface{} 转换为 int

go

我试图从 JSON 中获取一个值并将其转换为 int 但它不起作用,而且我不知道如何正确执行。

这是错误消息:

...cannot convert val (type interface {}) to type int: need type assertion

和代码:

    var f interface{}
    err = json.Unmarshal([]byte(jsonStr), &f)
    if err != nil {
        utility.CreateErrorResponse(w, "Error: failed to parse JSON data.")
        return
    }

    m := f.(map[string]interface{})

    val, ok := m["area_id"]
    if !ok {
        utility.CreateErrorResponse(w, "Error: Area ID is missing from submitted data.")
        return
    }

    fmt.Fprintf(w, "Type = %v", val)   // <--- Type = float64
    iAreaId := int(val)                // <--- Error on this line.
    testName := "Area_" + iAreaId      // not reaching here

阅读 256

收藏
2021-11-22

共1个答案

一尘不染

代替

iAreaId := int(val)

你想要一个类型断言

iAreaId := val.(int)
iAreaId, ok := val.(int) // Alt. non panicking version 

无法转换接口类型值的原因是引用的规范部分中的这些规则:

转换是形式为T(x)where Tis a type and xis a expression that can convert to type T.

在以下任何一种情况下,非常量值 x 都可以转换为类型 T:

  1. x 可分配给 T。
  2. x 的类型和 T 具有相同的基础类型。
  3. x 的类型和 T 是未命名的指针类型,它们的指针基类型具有相同的底层类型。
  4. x 的类型和 T 都是整数或浮点类型。
  5. x 的类型和 T 都是复数类型。
  6. x 是一个整数或一个字节片或符文,T 是一个字符串类型。
  7. x 是一个字符串,T 是一个字节或符文切片。

iAreaId := int(val)

任何情况下1.-7。

2021-11-22