Golang中interface{}转为数组的操作


Posted in Golang onApril 30, 2021

interface{} 转为普通类型

我们都知道在golang中interface{}可以代表任何类型,对于像int64、bool、string等这些简单类型,interface{}类型转为这些简单类型时,直接使用

p, ok := t.(bool)
p, ok := t.(int64)

如果ok==true的话,就已经类型转换成功。

假设有这样一个场景,我们有一个函数有返回值,但是返回值的类型不定,所以我们的返回值类型只能以接口来代替了。

返回接口类型之后,我们就要对其类型进行判断然后进行类型转换。如果返回的是数组的话,我们就不能像上面那样直接进行转换了。

那有什么办法呢?

可以考虑使用reflect.Typeof(mm).Kind()。

func generate() (interface{}, bool) {
	//s := []string{"123", "345", "abc"}
	//s := 123
	s := "mmm"
	return s, true
}
func test() {
	origin, ok := generate()
	if ok {
		switch reflect.TypeOf(origin).Kind() {
		case reflect.Slice, reflect.Array:
			s := reflect.ValueOf(origin)
			for i := 0; i < s.Len(); i++ {
				fmt.Println(s.Index(i))
			}
		case reflect.String:
			s := reflect.ValueOf(origin)
			fmt.Println(s.String(), "I am a string type variable.")
		case reflect.Int:
			s := reflect.ValueOf(origin)
			t := s.Int()
			fmt.Println(t, " I am a int type variable.")
		}
	}
}

generate()函数有两个返回值,一个是接口类型,一个是bool类型。

我们只对第一个参数进行处理,首先使用reflect.TypeOf(mm).Kind()获得mm的类型,然后采用switch语句来判断mm的类型,类型判断完之后进入相应的case,然后通过reflect.ValueOf(mm)来mm的值取出来,如果mm本身是个数组的话,那么s也是一个数组,就可以进行遍历操作了。

总结

1、对于我们已知返回值是哪种类型的情况下,可以直接将返回值进行类型转换,像上面那种转为普通类型的方法一样。

2、对于返回值类型不是已知的情况下,可以考虑使用reflect.TypeOf()的方式。

补充:golang interface{}转换成struct结构体的两种方法

1.使用断言,强制转换

p, ok := (Value).(user)
     if ok {
         fmt.Println("id:" + p.Id)
         fmt.Println("name:" + p.Name)
     } else {
         fmt.Println("can not convert")
     }

2.json序列化

resByre,resByteErr:=json.Marshal(ResponseData)
 if resByteErr != nil {
  c.Data(utils.ErrorResult("读取信息失败" + resByteErr.Error()))
  return
 }
 var newData MnConfig
 jsonRes:=json.Unmarshal(resByre,&newData)
 if jsonRes != nil {
  c.Data(utils.ErrorResult("读取信息失败" + jsonRes.Error()))
  return
 }

实例:

package main 
import (
 "encoding/json"
 "fmt"
)
 
type user struct {
 Id int `json:"id"`
 Name string `json:"name"`
} 
 
func main() { 
 newUser:=user{
  Id:   1,
  Name: "杉杉",
 }
 
 var newInterface1 interface{}
 
 //第一种使用interface
 newInterface1=newUser
 fmt.Printf("使用interface: %v",newInterface1.(user))
 
 //第二种使用json
 var newInterface2 interface{}
 newInterface2=newUser
 resByre, resByteErr := json.Marshal(newInterface2)
 if resByteErr != nil {
  fmt.Printf("%v",resByteErr)
  return
 }
 var newData user
 jsonRes := json.Unmarshal(resByre, &newData)
 if jsonRes != nil {
  fmt.Printf("%v",jsonRes)
  return
 }
 fmt.Printf("使用 json: %v",newData)
 
}

结果:

Golang中interface{}转为数组的操作

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
golang interface判断为空nil的实现代码
Apr 24 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
golang 实现时间戳和时间的转化
May 07 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
深入理解go slice结构
Sep 15 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Golang日志包的使用
Apr 20 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Go语言编译原理之变量捕获
Aug 05 Golang
解决Go gorm踩过的坑
Apr 30 #Golang
Golang 如何实现函数的任意类型传参
Apr 29 #Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 #Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 #Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 #Golang
Go使用协程交替打印字符
Apr 29 #Golang
golang goroutine顺序输出方式
Apr 29 #Golang
You might like
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
php中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
JavaScript内核之基本概念
2011/10/21 Javascript
jQuery事件 delegate()使用方法介绍
2012/10/30 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
javascript获取以及设置光标位置
2017/02/16 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
原生js调用json方法总结
2018/02/22 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
意向协议书范本
2014/04/23 职场文书
开服装店计划书
2014/08/15 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
售票员岗位职责
2015/02/15 职场文书