1.整数类型
整数类型就是存放整数的,如
18
,-18
,123534
等,在GO语言中,几乎不同于其它语言,以字节的视角来看其int类型还分为不同的int表达,首先int还要分为两大类。
1.1.有符号整数类型
有符号就是整数有正负之分
我们来看下图:
可以看到,这4个int后面都带了数字,这其实就是这个int类型占用内存最大的比特位,比如int8,就是这个int类型最大只能占用8个比特位,也就是一个字节(1个字节 == 8个比特位),其他的int也是这样来看的,这中分类也就确定了各个int的表数范围,所以我们在定义一个整型值使,要估摸这个整型值的范围,再来确定使用哪个int的类型。
我们可以看看这些表示int的类型其大小是不是如此呢?
package main import ( "fmt" "unsafe" ) func main(){ var num1 int8 fmt.Println(unsafe.Sizeof(num1)) var num2 int16 fmt.Println(unsafe.Sizeof(num2)) var num3 int32 fmt.Println(unsafe.Sizeof(num3)) var num4 int64 fmt.Println(unsafe.Sizeof(num4)) }
可以看到,不同的int类型其字节大小的确不同。
- 如果说int类型赋值不当就会出现如下的错误:
package main import "fmt" func main(){ var num1 int8 = 666 // int8 不能承受666这个值 fmt.Println(num1) }
也就是说666
不能作为值赋给int8
,不然编译就会出问题,应该使用更高存储字节空间的int类型来存放。
1.2.无符号整数类型
无符号整数类型就是没有负数之说只有整正数(没有符号位)
我们来看下图:
可以看到,无符号整数类型在有符号整数类型int的前面多了一个u,这就是表示无符号的意思,值得注意的是,其占用储存空间的字节大小没有变化,但表数范围变了,变得没有负数了,最大值更大了,这就是无符号整型的优势,如果你想表达的数据咬定没有负数,那么选无符号整型类型会更好些(如表示身高,年龄)。
当然,如果用无符号整型取存放负数,这也是会严格的报错的
1.3.其他整数类型
我们来看下图:
可以看到,int
和uint
他们的字节大小是由计算机系统的位数来决定的,rune就相当于int32
,byte
相当于uint8
(在后面byte
可以用作字符
的类型)。
定义如下:
package main import "fmt" func main(){ var a int = 3 var b uint = 5 var c rune = 10 var d byte = 20 var e byte = 'a' }
1.4.额外知识
- Golang的整数类型,默认声明为int类型
- 变量占用的字节数
首先要求变量所占用的字节数,需要引入
unsafe
这个包,然后使用这个包里面的Sizeof
来求
package main import ( "fmt" "unsafe" // 引入包 ) func main(){ // 直接使用 var num1 int8 fmt.Println(unsafe.Sizeof(num1)) // 1 var num2 int16 fmt.Println(unsafe.Sizeof(num2)) // 2 var num3 int32 fmt.Println(unsafe.Sizeof(num3)) // 4 var num4 int64 fmt.Println(unsafe.Sizeof(num4)) // 8 }
- 这么多整数类型,使用的时候该如何选择呢?Golang程序中整型变量在使用时,遵守保小不保大的原则, 即: 在保证程序正确运行下,尽量使用占用空间小的数据类型
// 表示学生年龄 var age byte = 8 // 小的数据尽量用byte存放
2.浮点类型
简单来说,浮点类型就是用来存放小树值的, 如
3.14
,5.20
,-13.14
。
看下图:
在GO语言中,要创建浮点类型的变量,必须在float后面加上32或者64,因为单纯的一个float不会被当作浮点类型。
当我们在赋值给一个浮点类型的变量时,我们可以直接赋值小数,也可以用E(或者e)(科学计数法)表示,如下:
package main import ( "fmt" ) func main(){ var fa float32 = 314E-2 // E-2表示乘以10^-2 var fb float32 = 314E+2 // E+2表示乘以10^2 var fc float32 = 314e-2 // 小写e与大写E没有区别 var fd float32 = 3.14 // 直接赋值3.14 fmt.Println(fa) // 3.14 fmt.Println(fb) // 31400 fmt.Println(fc) // 3.14 fmt.Println(fd) // 3.14 }
- 我们在给float赋值的时候,很可能出现精度损失的情况,因此建议创建浮点类型的时候最好用
float64
。
package main import "fmt" func main(){ //浮点数可能会有精度的损失,所以通常情况下,建议你使用:float64 var num7 float32 = 520.000001314 fmt.Println(num7) var num8 float64 = 520.000001314 fmt.Println(num8) }
运行结果:
3.字符类型
- Golang中没有专门的字符类型,如果要存储单个字符(字母),一般使用
byte
来保存。- Golang中字符使用UTF-8编码
UTF-8编码链接
UTF-8编码:
- 当我们用
byte类型来定义一个字符变量
,将其打印出来的值是其对应的ASCLL
码值,各个字符的ASCLL
码值对应如下:
示例如下:
所以字符类型,本质上就是一个整数,也可以直接参与运算,输出字符的时候,会将对应的码值做一个输出,但如果我们用Printf
打印(括号里要用%c
),可以打印出字符:
如果我们想要打印中文字符,比如打印一个中,这时byte
类型就存放不下其对应的ASCLL
码值了,所以这时我们应该使用int
。
package main import "fmt" func main(){ var c int = '中' fmt.Println(c) //汉字字符,底层对应的是Unicode码值 //对应的码值为20013,byte类型溢出,能存储的范围:可以用int //总结:Golang的字符对应的使用的是UTF-8编码 //(Unicode是对应的字符集,UTF-8是Unicode的其中的一种编码方案) }