golang判断变量的类型

判断container的类型

《golang判断变量的类型》

打印其中的元素之前,正确判断变量的类型,使用“类型断言”表达式。
value, ok := interface{}(container).([]string)
《golang判断变量的类型》
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
《golang判断变量的类型》
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编码的字符串被拆分成零散、独立的字节。
《golang判断变量的类型》
从下面也可以看出一个string类型转换成[]rune类型,字符串被拆成一个一个Unicode字符
《golang判断变量的类型》

别名类型

《golang判断变量的类型》

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

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

MyString类型就是string
《golang判断变量的类型》
因为MyString2的潜在类型是string,所以互转
《golang判断变量的类型》

2.但是对于集合类的类型[]MyString2与[]string来说,类型互转这样做却是不合法的,[]Mystring2和[]string的潜在类型不同,分别是[]MyString和[]string 。
《golang判断变量的类型》
这个地方爆红了,说明类型转换不成功
《golang判断变量的类型》

总结

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

    原文作者:生活热爱就好
    原文地址: https://blog.csdn.net/qq_41891425/article/details/112831072
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞