解决:interface conversion: interface {} is float64, not int

举报
liuzhen007 发表于 2021/11/14 23:20:23 2021/11/14
【摘要】 ​目录前言正文结尾前言今天遇到一个小坑,但是自己陷进去好久,说起来有些不好意思,但是感觉还是应该拿出来晒一晒,希望大家别再被类似的问题耽误了。解析下面的 json 结构:"video": { "width": 1280, "height": 720}首先,我们把问题简化,假设我们拿到了 map[string]interface{} 类型的 video 实例,如何基...

目录

  • 前言
  • 正文
  • 结尾

前言

今天遇到一个小坑,但是自己陷进去好久,说起来有些不好意思,但是感觉还是应该拿出来晒一晒,希望大家别再被类似的问题耽误了。

解析下面的 json 结构:

"video": {
        "width": 1280,
        "height": 720
}

首先,我们把问题简化,假设我们拿到了 map[string]interface{} 类型的 video 实例,如何基于 video 实例读取 width 和 height 的值,注意是整形数值,不是字符串。

正文

原始方案

根据我们抽象出来的问题,解决思路也是非常清晰的,我们先根据 string 类型的关键字 key,也就是 width 和 height 得到接口对象 w 和 h。然后,对接口类型进行强制转换,得到最终的 int 整形数值。

最开始的编码方式是直接对接口类型的 w 和 h 强转 int 整形类型,就发生上面的报错:

interface conversion: interface {} is float64, not int

具体代码实现如下:

w := video["width"]
h := video["height"]
if w != nil && h != nil {
        width := w.(int)
        height := h.(int)
        logger.Infof("width:%d, height:%d", width, height)
        if width != 0 && height != 0 {
                output.Dimensions = strconv.Itoa(width) + "x" + strconv.Itoa(height)
        }
}

最终方案

出现上述问题时,自己始终没有意识到,interface {} 接口类型不可以直接强转成 int 整形类型,始终怀疑自己在编码细节上有问题,因此走偏了。

最终的结果就是换了多种实现方式,但都没有改到根本上。后来无意中看到 Golang 类型介绍时,才发现 interface {} 接口类型是 float64 类型,如果想要得到 int 整形数值,需要先转换成 float 类型。

因此,找到了最终的解决方法。

最终代码实现如下:

w := video["width"]
h := video["height"]
if w != nil && h != nil {
        width := int(w.(float64))
        height := int(h.(float64))
        logger.Infof("width:%d, height:%d", width, height)
        if width != 0 && height != 0 {
                output.Dimensions = strconv.Itoa(width) + "x" + strconv.Itoa(height)
        }
}

结尾

这是实际开发过程中遇到的一个小坑,但是让我意识到了对盲点的持续补齐。好啦,就说这么多吧。



作者简介:大家好,我是 liuzhen007(Data-Mining),是一位音视频技术爱好者,同时也是CSDN博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。