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项目中使用init()
Apr 12 Golang
基于go interface{}==nil 的几种坑及原理分析
Apr 24 Golang
win10下go mod配置方式
Apr 25 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
Go 自定义package包设置与导入操作
May 06 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
golang内置函数len的小技巧
Jul 25 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
详解Go语言中Get/Post请求测试
Jun 01 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 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
Drupal7中常用的数据库操作实例
2014/03/02 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
Javascript 继承机制实例
2009/08/12 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
2011/04/05 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
jQuery按需加载轮播图(web前端性能优化)
2017/02/17 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
Django+vue跨域问题解决的详细步骤
2019/01/20 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
python分布式环境下的限流器的示例
2017/10/26 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
安全教育演讲稿
2014/05/09 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
小学中队活动总结
2015/05/11 职场文书
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript