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语言中的UTF-8实现
Apr 26 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
Golang 编译成DLL文件的操作
May 06 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
golang定时器
Apr 14 Golang
Go结合Gin导出Mysql数据到Excel表格
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获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
js实现简易ATM功能
2020/10/27 Javascript
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
Python 命令行参数sys.argv
2008/09/06 Python
python类继承用法实例分析
2014/10/10 Python
pygame学习笔记(2):画点的三种方法和动画实例
2015/04/15 Python
python从sqlite读取并显示数据的方法
2015/05/08 Python
python设计模式大全
2016/06/27 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
Python实现简单查找最长子串功能示例
2019/02/26 Python
set在python里的含义和用法
2019/06/24 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
投资意向书
2014/07/30 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL