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 相关文章推荐
go语言map与string的相互转换的实现
Apr 07 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
GO中sync包自由控制并发示例详解
Aug 05 Golang
Python测试框架pytest核心库pluggy详解
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
php组合排序简单实现方法
2016/10/15 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
HR vs CL BO3 第二场 2.13
2021/03/10 DOTA
用js解决数字不能换行问题
2010/08/10 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
python动态网页批量爬取
2016/02/14 Python
Python反射的用法实例分析
2018/02/11 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
培训主管的岗位职责
2013/11/23 职场文书
公司部门司机岗位职责
2014/01/03 职场文书
大学生党员自我批评
2014/02/14 职场文书
团日活动总结报告
2014/06/25 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
物流业务员岗位职责
2015/04/03 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
高一英语教学反思
2016/03/03 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL