cannot use variable (type interface {}) as type int in assignment: need type assertion

更新日期: 2020-07-08 阅读次数: 585 字数: 290 分类: golang

在使用 golang gin 时,通过 context get 获取的值在赋值给一个整型变量时,报错

cannot use variable (type interface {}) as type int in assignment: need type assertion

代码模拟如下:

package main

import "fmt"

func main() {
	var tmp interface{}
	var i int
	tmp = 1
	i = tmp
	fmt.Println(i)
}

报错的代码行是 i = tmp 那行。

可见,interface{} 类型可以被任何类型赋值,但是 interface{} 不可以直接给其他类型赋值。

解决方法

//i = tmp
i = tmp.(int)

什么是 type assertion

https://tour.golang.org/methods/15

A type assertion provides access to an interface value's underlying concrete value.

概况来说,type assertion 就是提供了 interface{} 类型转换的方法。

如果类型不符呢

测试一下,将 interface{} 的值换成字符串类型。

func main() {
	var tmp interface{}
	var i int
	tmp = "golang 性能不错"
	i = tmp.(int)
	fmt.Println(i)
}

程序直接 panic ...

panic: interface conversion: interface {} is string, not int

更严谨的处理方法

i, ok = tmp.(int)

// or
if i, ok := tmp.(int); ok {
    /* act on int */
} else {
    /* not int */
}

在 ok 为 true 时,说明类型转换成功。

领取阿里云/腾讯云服务器优惠券

关于作者

我是来自山东烟台的一名开发者,喜欢瞎折腾,顺便记记笔记。有敢兴趣的话题,欢迎加微信 zhongwei 聊聊, 查看更多联系方式。 白天写程序,晚上哄熊孩子,可能回复有点慢,见谅。同时也欢迎关注我的微信公众号“大象工具”: 大象工具微信公众号

tags: type assertion

相关文章

爱评论不评论

近期节日

2020年10月31日 世界勤俭日
2020年11月01日 万圣节
2020年11月07日 立冬
2020年11月08日 中国记者日
2020年11月10日 世界青年节
2020年11月11日 光棍节
2020年11月14日 世界糖尿病日
2020年11月17日 国际大学生节
2020年11月20日 国际儿童日
2020年11月21日 世界问候日
2020年11月22日 小雪
2020年11月26日 感恩节
查看更多节日