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中ResponseWriter的一个坑
Apr 27 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go语言基础知识点介绍
Jul 04 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Go语言grpc和protobuf
Apr 13 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang 对es的操作实例
Apr 20 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
FCKeditor添加自定义按钮
2008/03/27 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
详解PHP用substr函数截取字符串中的某部分
2016/12/03 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
Laravel中的Blade模板引擎示例详解
2017/10/10 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
js arguments,jcallee caller用法总结
2013/11/30 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
python实现Windows电脑定时关机
2018/06/20 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
10个示例带你掌握python中的元组
2020/11/23 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
教师实习自我鉴定
2013/12/13 职场文书
公积金单位接收函
2014/01/11 职场文书
本科生职业生涯规划书范文
2014/01/21 职场文书
年终晚会活动方案
2014/08/21 职场文书
给领导的感谢信范文
2015/01/23 职场文书
2015年人事工作总结范文
2015/04/09 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技