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通过递归遍历生成树状结构的操作
Apr 28 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
深入理解go slice结构
Sep 15 Golang
golang语言指针操作
Apr 14 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Go语言编译原理之变量捕获
Aug 05 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 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+xslt在windows平台上
2006/10/09 PHP
global.php
2006/12/09 PHP
dedecms模板标签代码官方参考
2007/03/17 PHP
php 传值赋值与引用赋值的区别
2010/12/29 PHP
一些php技巧与注意事项分析
2011/02/03 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
jquery得到iframe src属性值的方法
2014/09/25 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
H5上传本地图片并预览功能
2017/05/08 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
Python的迭代器和生成器使用实例
2015/01/14 Python
使用pandas的DataFrame的plot方法绘制图像的实例
2018/05/24 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
Stubhub英国:购买体育、演唱会和剧院门票
2018/06/10 全球购物
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
远程研修随笔感言
2014/02/10 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
王老吉广告词
2014/03/20 职场文书
关爱残疾人标语
2014/06/25 职场文书
会计人员演讲稿
2014/09/11 职场文书
股东授权委托书范本
2014/09/13 职场文书
房产分割协议书范文
2014/11/21 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
爱国影片观后感
2015/06/18 职场文书