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在GRPC中设置client的超时时间
Apr 27 Golang
对Golang中的FORM相关字段理解
May 02 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 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
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
PHP 工厂模式使用方法
2010/05/18 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
php实现高效获取图片尺寸的方法
2014/12/12 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
python常用函数详解
2016/09/13 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
2019/02/13 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
几个MySql的面试题
2013/04/22 面试题
房地产管理毕业生自荐信
2013/11/04 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
2016年公司新年寄语
2015/08/17 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技
python manim实现排序算法动画示例
2022/08/14 Python