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原生库的中bytes.Buffer用法
Apr 25 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
go xorm框架的使用
May 22 Golang
Golang中异常处理机制详解
Jun 08 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Golang 切片(Slice)实现增删改查
Apr 22 Golang
Go语言编译原理之源码调试
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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
XAMPP安装与使用方法详细解析
2013/11/27 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
JavaScript实现存储HTML字符串示例
2014/04/21 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
深入理解vue路由的使用
2017/03/24 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
成人毕业生自我鉴定
2013/10/18 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
Java设计模式之享元模式示例详解
2022/03/03 Java/Android
MySQL RC事务隔离的实现
2022/03/31 MySQL
Python  lambda匿名函数和三元运算符
2022/04/19 Python