golang数据的类型识别、获取与判断

本文介绍Golang中数据类型的动态识别、获取与判断方法,包括使用interface{}
部署运行你感兴趣的模型镜像

golang数据的类型识别、获取与判断

golang是一种简洁、方便、效率高的语言,很适合C/C++、Python等程序员使用。
golang是静态语言,但是具有动态语言的特性,这篇文章主要介绍golang的数据类型在运行期的识别、获取和判断方法,让大家可以感受到golang静态语言的动态特性。

1.类型识别

在我们编码中,经常会碰到读取数据时,要判断数据是哪种类型,典型的是json格式文本的读取和识别。在golang中主要用 x.(T)的方式来识别类型:x是变量,而且是不确定类型的变量,interface,如果是已知类型的,比如x是string,那么就会报错:invalid type assertion: data.(string) (non-interface type string on left),当然也不能是常量,常量的类型已知,不需要做类型判断。T是类型字面量,就是类型的名称,举例来说:

var data interface{} = "hello"
strValue, ok := data.(string)
if ok {
	fmt.Printf("%s is string type\n", strValue)
}

T的类型并不是任意的,比如有如下json

var f interface{}
b := []byte(`[{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}]`)
json.Unmarshal(b, &f)
data, ok := f.([]interface{})    // 这里不能使用f.([]map[string]interface{}),这样是无法判断成功的
if ok {
	fmt.Printf("%+v\n", data)
	return
}

所以,x.(T)的方式只能判断一层?这点还没有经过证实,等后面看了源码之后再确定吧

2.类型获取

可以使用反射的方式获取变量的类型
reflect.TypeOf(x)
比如:

var str string = “hello”
fmt.Println(reflect.TypeOf(str))

输出:string

3.类型判断

如果有一系列的数据要识别类型,可以用switch的类型判断语句,分类识别确认。还是以上面json格式的识别判断为例:

var f interface{}
b := []byte(`[{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}]`)
json.Unmarshal(b, &f)

for k, v := range f.(map[string]interface{}) {
	switch vv := v.(type) {
	case string:
		fmt.Println(k, "is string", vv)
	case int:
		fmt.Println(k, "is int ", vv)
	case float64:
		fmt.Println(k, "is float64 ", vv)
	case []interface{}:
		fmt.Println(k, "is array:")
		for i, j := range vv {
			fmt.Println(i, j)
		}
	}
}

注意:switch这句,vv := v.(type)只有在switch中才能使用,如果单独使用是会报错的。

通过以上三种方法,基本上可以满足golang中对类型的动态识别、获取和判断操作了。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值