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设置多个GOPATH的方式
May 05 Golang
go类型转换及与C的类型转换方式
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
解决golang 关于全局变量的坑
May 06 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
Golang二维数组的使用方式
May 28 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
Golang jwt身份认证
Apr 20 Golang
Golang并发工具Singleflight
May 06 Golang
Go gorilla/sessions库安装使用
Aug 14 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
DedeCms模板安装/制作概述
2007/03/11 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
BOM与DOM的区别分析
2010/10/26 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
flask session组件的使用示例
2018/12/25 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
python的pstuil模块使用方法总结
2019/07/26 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
材料物理专业大学毕业生求职信
2013/10/15 职场文书
资料员的岗位职责
2013/11/20 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
2015感人爱情寄语
2015/02/26 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js