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各时间字符串使用解析
Apr 02 Golang
彻底理解golang中什么是nil
Apr 29 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
golang日志包logger的用法详解
May 05 Golang
Go标准容器之Ring的使用说明
May 05 Golang
golang 实现并发求和
May 08 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Go 中的空白标识符下划线
Mar 25 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
golang定时器
Apr 14 Golang
Go gorilla/sessions库安装使用
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学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
提高php运行速度的一些小技巧分享
2012/07/03 PHP
PHP的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
php四种定界符详解
2017/02/16 PHP
php微信开发之关注事件
2018/06/14 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
python绘制双柱形图代码实例
2017/12/14 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
django用户登录和注销的实现方法
2018/07/16 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
Hotels.com印度:酒店预订
2019/05/11 全球购物
高中生学习的自我评价
2013/12/14 职场文书
个人校本研修方案
2014/05/26 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
小学总务工作总结
2015/08/13 职场文书
幼儿园安全教育随笔
2015/08/14 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
CSS实现章节添加自增序号的方法
2021/06/23 HTML / CSS