golang interface{}类型转换的实现示例

 更新时间:2024年10月15日 10:39:07   作者:快刀一哥  
在Go语言中,类型转换可以通过断言、显式、隐式和强制四种方式实现,针对interface{}类型转换为float32或float64,需要使用type断言或reflect包处理,感兴趣的可以了解一下

Golang中存在4种类型转换,分别是:断言、显式、隐式、强制。下面我将一一介绍每种转换使用场景和方法

遇到interface{}类型转换成float32 或者 float64类型进行存储,go中对变量类型转换有比较严格要求。

type断言

type断言配合switch 对每种类型的变量进行转换

func TpyeTransfer(value interface{}) (typ int, val interface{}) {

	switch value.(type) {

	case int:
		return 6, float32(value.(int))
	case bool:
		return 3, value.(bool)
	case int8:
		return 6, float32(value.(int8))
	case int16:
		return 6, float32(value.(int16))
	case int32:
		return 6, float32(value.(int32))
	case uint8:
		return 6, float32(value.(uint8))
	case uint16:
		return 6, float32(value.(uint16))
	case uint32:
		return 6, float32(value.(uint32))
	case float32:
		return 6, float32(value.(float32))

	case string:
		fmt.Printf("data type string is %T \n", value)
		return 0, value

	case int64:
		return 10, float64(value.(int64))
	case float64:
		return 10, float64(value.(float64))
	case uint64:
		return 10, float64(value.(uint64))

	default:

		fmt.Printf("data type is:%T \n", value)
		return 0, value

	}

这样转换有两个问题
1.对切片无法判断,切片有多个变量数值需要逐个处理
2.不能对多个类型的变量进行统一转换

reflect.TypeOf

利用reflect包进行处理,reflect包不能识别time.Time等其他包引入的结构体变量,需要和type断言组合使用

func typereflect(value interface{}) (typ int, val interface{}) {
	res := reflect.ValueOf(value)

	switch res.Kind() {
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32:
		return 6, float32(res.Int())
	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32:
		return 6, float32(res.Uint())
	case reflect.Float32:
		return 6, float32(res.Float())
	case reflect.Int64:
		return 10, float64(res.Int())
	case reflect.Uint64:
		return 10, float64(res.Uint())
	case reflect.Float64:
		return 10, res.Float()

	case reflect.Bool:

		return 3, res.Bool()
	default:
		fmt.Printf("ohter type is:%T \n", value)
		switch value.(type) {
		case time.Time:
			time := value.(time.Time)
			fmt.Println("time is ", time.Unix())
		}
		return 0, val

	}

}

如上两种方法感觉都不完美,在go中还没有赵傲比较完美的处理interface{}变量的方法,有了解更多处理方法的大神一起交流一下

到此这篇关于golang interface{}类型转换的实现示例的文章就介绍到这了,更多相关golang interface{}类型转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang使用CGO与Plugin技术运行加载C动态库

    Golang使用CGO与Plugin技术运行加载C动态库

    这篇文章主要介绍了Golang使用CGO与Plugin技术运行加载C动态库,Golang 程序在运行时加载C动态库的技术,跳过了Golang项目编译阶段需要链接C动态库的过程,提高了Golang项目开发部署的灵活性
    2022-07-07
  • 重学Go语言之数组的具体使用详解

    重学Go语言之数组的具体使用详解

    Go的数组是一种复合数据类型,在平时开发中并不常用,更常用的是切片(slice),可以把切片看作是能动态扩容的数组,切片的底层数据结构就是数组,所以数组虽不常用,但仍然有必要掌握
    2023-02-02
  • 一起来用GoLand开发第一个Go程序

    一起来用GoLand开发第一个Go程序

    当您在编辑器中工作时GoLand 会分析您的代码,寻找优化方法,并检测潜在和实际问题,下面这篇文章主要给大家介绍了关于用GoLand开发第一个Go程序的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Go语言类型转换及问题探讨

    Go语言类型转换及问题探讨

    本文探讨了Go语言中的类型转换机制,特别是在使用atomic.Pointer和unsafe时可能引发的问题,通过深入分析Go语言的类型转换规则,如数值类型间转换、字符串与byte/rune切片转换、slice与数组转换,以及底层类型相同时的转换,文章最后给出了一些在Go中使用类型转换的建议
    2024-10-10
  • golang 检查网络状态是否正常的方法

    golang 检查网络状态是否正常的方法

    今天小编就为大家分享一篇golang 检查网络状态是否正常的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • golang实现openssl自签名双向认证的详细步骤

    golang实现openssl自签名双向认证的详细步骤

    这篇文章主要介绍了golang实现openssl自签名双向认证的详细步骤,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • golang使用DockerFile正确用法指南

    golang使用DockerFile正确用法指南

    docker在开发和运维中使用的场景越来越多,作为开发人员非常有必要了解一些docker的基本知识,而离我们工作中最近的也就是对应用的docker部署编排了,这篇文章主要给大家介绍了关于golang使用DockerFile的正确用法指南,需要的朋友可以参考下
    2024-03-03
  • Go语言字符串高效拼接的实现

    Go语言字符串高效拼接的实现

    这篇文章主要介绍了Go语言字符串高效拼接的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Go + Gin实现双Token管理员登录的示例代码

    Go + Gin实现双Token管理员登录的示例代码

    本文主要介绍了Go + Gin实现双Token管理员登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • 深入理解GO语言的面向对象

    深入理解GO语言的面向对象

    相信很多人当初开发go语言的时候就是因为C++的特性太过于繁杂,从而使得很多C++的开发者因为C++的特性而头疼,go语言成功的精简了C++的特性,使其很简洁,很少的特性,却可以完成很多的事情。下面我们就来详细理解下GO语言的面向对象。
    2016-10-10

最新评论