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语言-在mac下brew升级golang
Apr 25 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
golang中的并发和并行
May 08 Golang
Golang中异常处理机制详解
Jun 08 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
Golang的继承模拟实例
Jun 30 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Golang 入门 之url 包
May 04 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 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 数学运算验证码实现代码
2009/10/11 PHP
php 面向对象的一个例子
2011/04/12 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
Python中zfill()方法的使用教程
2015/05/20 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
python用post访问restful服务接口的方法
2018/12/07 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
C++的几个面试题附答案
2016/08/03 面试题
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
招聘与培训专员岗位职责
2014/01/30 职场文书
员工拓展培训方案
2014/02/15 职场文书
会计岗位描述
2014/02/22 职场文书
小学生秋游活动方案
2014/02/23 职场文书
个人授权委托书格式
2014/08/30 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
德劲DE1108畅想
2021/04/22 无线电