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 25 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
Go使用协程交替打印字符
Apr 29 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Golang 入门 之url 包
May 04 Golang
Golang入门之计时器
May 04 Golang
基于Python实现西西成语接龙小助手
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
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
python中set常用操作汇总
2016/06/30 Python
Python常见字典内建函数用法示例
2018/05/14 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
Python3 读取Word文件方式
2020/02/13 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
详解python tkinter 图片插入问题
2020/09/03 Python
python如何停止递归
2020/09/09 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
数控加工专业毕业生自荐信
2013/09/27 职场文书
毕业自我评价范文
2013/11/17 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
学生检讨书范文
2015/01/27 职场文书
迟到检讨书范文
2015/01/27 职场文书
2015年底工作总结范文
2015/05/15 职场文书
幼儿园六一主持词
2015/06/30 职场文书
金榜题名主持词
2015/07/02 职场文书