解决:interface conversion: interface {} is float64, not int
Posted Data-Mining
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决:interface conversion: interface {} is float64, not int相关的知识,希望对你有一定的参考价值。
目录
- 前言
- 正文
- 结尾
前言
今天遇到一个小坑,但是自己陷进去好久,说起来有些不好意思,但是感觉还是应该拿出来晒一晒,希望大家别再被类似的问题耽误了。
解析下面的 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博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!
以上是关于解决:interface conversion: interface {} is float64, not int的主要内容,如果未能解决你的问题,请参考以下文章
c++中结构体套结构体用 = {0}初始化编译报错解决办法(用memset或者={})(error: invalid conversion)
如何在 iOS Swift 中使用 Watson Conversation?
迅雷QQ旋风-链接自动转换(Download link conversion)
迅雷QQ旋风-链接自动转换(Download link conversion)
C++编译报错:error: expected constructor, destructor, or type conversion before ‘(’ token