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 相关文章推荐
Golang二维切片初始化的实现
Apr 08 Golang
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
彻底理解golang中什么是nil
Apr 29 Golang
golang中的并发和并行
May 08 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Go Grpc Gateway兼容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迭代器的内部执行过程详解
2013/11/12 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
Yii使用migrate命令执行sql语句的方法
2016/03/15 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
JS字符串按逗号和回车分隔的方法
2017/04/25 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
Python编程中对文件和存储器的读写示例
2016/01/25 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
python实现烟花小程序
2019/01/30 Python
python如何制作英文字典
2019/06/25 Python
python删除某个目录文件夹的方法
2020/05/26 Python
python 制作本地应用搜索工具
2021/02/27 Python
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
大四本科生的自我评价
2013/12/30 职场文书
物流业务员岗位职责
2014/02/08 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
Python爬虫基础讲解之请求
2021/05/13 Python
python 提取html文本的方法
2021/05/20 Python
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL