• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Golang中interface{}转为数组的操作

    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 实现interface类型转string类型
    • 解决golang 反射interface{}做零值判断的一个重大坑
    • 基于go interface{}==nil 的几种坑及原理分析
    • golang interface判断为空nil的实现代码
    • 详解Golang语言中的interface
    • 使用go的interface案例实现多态范式操作
    • go 类型转换方式(interface 类型的转换)
    上一篇:解决Go gorm踩过的坑
    下一篇:golang slice元素去重操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Golang中interface{}转为数组的操作 Golang,中,interface,转为,数组,