golang判断变量的类型

判断container的类型

在这里插入图片描述

打印其中的元素之前,正确判断变量的类型,使用“类型断言”表达式。
value, ok := interface{}(container).([]string)
在这里插入图片描述
ok是bool类型得,它代表判断的结果true或者false。如果是true,那么被判断的值将会被自动转换为[]string,并赋值给变量value,否则value将被赋值为nil。ok也可以没有,断言表达式的结果,可以只赋给一个变量value,但是这种情况,如果判断为否就会引发异常,panic(运行时抛出的异常),除非显式地恢复这种恐慌,否则它会使go程序崩溃并停止。所以,在一般情况下,应该使用带ok变量的写法。

类型断言

类型断言表达式的语法形式是x.(T),其中x代表要被判断类型的值,这个值当下必须是接口类型的,具体是哪个接口类型无所谓。上面的container变量类型不是任何的接口类型时,应该把它转成某个接口类型的值。如果container时某个接口类型了,那么断言表达式就可以式container.([]string)。
go语言中,interface{}代表空接口,任何类型都是它的实现类型。任何类型的值都可以很方便地被转化成空接口的值。一对不包裹任何东西的花括号,除了可以代表空的代码块之外,还可以用于表示不包含任何内容的数据结构(或者说数据类型)。struct{},代表了不包含任何字段和方法的、空的结构体类型。而空接口interface{}则表达了不包含任何方法定义的、空的接口类型。一些集合类的数据类型来说,{}还可以用来表达其值不包含任何元素,比如空的切片值[]string{},以及空的字典值map[int]string{}。

类型转换

类型转换表达式的语法形式T(x)。其中x可以是一个变量,也可以是一个代表值的字面量(如1.2和struct{}),还可以是一个表达式。如果是表达式,那么该表达式的结果只能是一个值,而不能是多个值。在这个上下文中,x可以被叫做源值,它的类型就是源类型,而那个T代表的类型就是目标类型。
interface{}(container)
源值是container变量,目标类型是interface{}

整数类型、整数常量之间的类型转换

T(x):x是源值,T是目标类型
1.源值在目标类型的可表示范围内就是合法的。
比如uint8(255)可以把无类型的常量255转换为uint8类型的值
2.源整数类型的可表示范围较大,目标类型的可表示类型较小
比如把值的类型从int16转换为int8
在这里插入图片描述
int16类型的-255的补码是1111111100000001。如果我们把值转换为int8类型的值,那么go语言会把较高位置(最左边位置)上的8位二进制数直接截掉,从而得到00000001。这样最高位(最左边一位)是0,即是一个正整数,正整数的原码和补码相等,所以desInt的值就是1。
当整数值的类型的有效范围由宽变窄,只需在补码的形式下截掉一定数量的高位二进制数即可。
当把一个浮点数类型的值转换为整数类型值时,前者的小数部分会全部截掉。
补充:整数在go语言以及计算机中都是以补码的形式存储的。补码就是原码各位求反再加一。
计算机存储使用补码的原因:
1.避免了0的编码有两个
2.符号位和有效位可以一起处理,减法可以用加法处理,有的计算机没有乘法器,乘法也是用加法器实现的。

整数值转换为一个string类型的值

转换的整数值应该可以代表一个有效的Unicode代码点,否则转换的结果将会是"�"(仅由高亮的问号组成的字符串值),字符"�"的Unicode代码点时U+FFFD。它是Unicode标准中定义的Replacement Character,专用于替换那些未知的、不被认可以及无法展示的字符。
比如 string(-1),-1无法代表一个有效的Unicode代码点,所以得到的总会是"�"。

string类型与各种切片类型之间的互转

一个值从string类型向[ ]byte类型转换时代表着以UTF-8编码的字符串会被拆分成零散、独立的字节。ASCII编码兼容的那部分字符集,是可以以某个单一字节代表一个字符。以UTF-8编码的某个单一字节是无法代表一个字符的。下面中的前三个字节代表你,后面三个字节代表好。
所以一个string 类型向[]byte类型转换时代表着以UTF-8编码的字符串被拆分成零散、独立的字节。
在这里插入图片描述
从下面也可以看出一个string类型转换成[]rune类型,字符串被拆成一个一个Unicode字符
在这里插入图片描述

别名类型

在这里插入图片描述

关键字type声明自定义的各种类型。这些类型必须在Go语言基本类型和高级类型的范畴之内。
type MyString=string
MyString是string类型的别名类型。别名类型与其源类型的区别只是在名称上,它们是完全相同的。Go语言内建的基本类型中就存在两个别名名称。byte是uint8的别名类型,而rune是int32的别名类型。
type MyString2 string//这里没有等号
MyString2和string 就是两个不同的类型。这里的MyString2是一个新的类型,不同于其他任何类型。这种方式也叫做对类型的在定义。这里的类型再定义,string可以成为MyString2的潜在类型。潜在类型的含义是,某个类型在本质上是哪个类型。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.潜在类型相同的不同类型之间是可以进行类型转换的。因此,MyString2类型的值和string类型的值可以使用类型转换表达式进行互转。

MyString类型就是string
在这里插入图片描述
因为MyString2的潜在类型是string,所以互转
在这里插入图片描述

2.但是对于集合类的类型[]MyString2与[]string来说,类型互转这样做却是不合法的,[]Mystring2和[]string的潜在类型不同,分别是[]MyString和[]string 。
在这里插入图片描述
这个地方爆红了,说明类型转换不成功
在这里插入图片描述

总结

1.go语言的每个变量都是有类型的,我们可以使用类型断言表达式判断变量是哪个类型的。
2.如果总是应该把结果赋给两个变量,还要保证被判断的变量是接口类型的,这可能会用到类型转换表达式。
3.别名类型声明和类型再定义的区别,它们的值在类型转换、判等、比较和赋值操作方面的不同。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生活热爱就好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值