我试图从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

推荐答案

而不是

iAreaId := int(val)

你想要type assertion:

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

无法convert接口类型值的原因是引用的等级库部件中的以下规则:

转换是形式为T(x)的表达式,其中T是类型,x是可转换为类型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)

任何一种情况都是not-7.

Go相关问答推荐

带有Go map[字符串]字符串的持久磁盘

语法-for循环中的initit陈述是否允许分配?

+在具有html/模板Golang的Base64中

未对GoFr中的所有请求进行跟踪

Wamtime Memory中的‘Offset’是什么?Read?

Golang Gorm Fiber / argon2.Config 未定义

在运行时更改 Go lang slog 的日志(log)级别

如何模拟 stripe 需要 webhooks 的捕获事件?

Go 中如何判断 struct 体是否包含另一个 struct 体?

同一文件上的多个 Arrow CSV 阅读器返回 null

使用 Go 根据 /etc/shadow 文件中的散列密码验证密码

GoLang:net.LookupHost 返回重复的 ips

转换朴素递归硬币问题时的记忆错误

获取不带类型参数的泛型 struct 的类型名称

如何将一片 map 转换为一片具有不同属性的 struct

Protobuf.Any - 从 json.RawMessage 解组

go:识别重新定义标志的包

如果服务器在客户端的 gRPC 中不可用,则等待的方法

函数调用中的类型参数panic

Go模板中的浮点除法