Go语言基础数据类型

数据类型的转换与运算

数据类型是一门高级语言的基础,Go属于又属于强类型静态编译语言。Go语言拥有两大数据类型,基本数据类型和复合数据类型。

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图1

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图2

整型

数据类型 说明 取值范围
有符号整数
int8 有符号 8位整数 -128到 127
int16 有符号 16位整数 -32768 到32767
int32 有符号 32位整数 -2147483648到2147483647
int64 有符号 64位整数 -9223372036854775808到9223372036854775807
无符号整数
uint8 无符号8位整数 0到255
uint16 无符号16位整数 0到65535
uint32 无符号32位整数 0到4294967295
uint64 无符号64位整数 0到18446744073709551615

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图3

  • int后面的8, 代表转成二进制的长度。 8个0/1码。
  • uint8 最小的值转为二进制是00000000八个零, 再转为十进制最小应该是0。最大的值转为二进制是11111111八个一 ,再转为十进制应该是255。
  • 有符号: 带符号的表示转为数值后,最高位表示符号位 ,0 表示正数, 1表示负数 ,剩余的位才表示数值。
  • 无符号: 无符号 没有正负之分 所有的位都表示数值。

Go语言中int类型的大小与具体的平台有关系,一般来说,int在32位系统中是4字节,在64位系统中是8字节,使用简短定义自动推导类型初始化一个整数,默认为int类型。 关于int类型的取值范围,如果要把一个大的数字,放进小的数据类型则会放不进去。

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图4

  1. var n int8
  2. n=100
  3. fmt.Println(n) //100 没有问题
  4. //如果赋值为200 则不行 因为int8取值范围最大是127
  5. var i2 uint8
  6. i2=200
  7. fmt.Println(i2) //200 uint8 取值范围最大是0到255

在Go语言中 byte与uint8 是一样的,rune与int32是一样的,代表同一种数据类型。但是int和int64 不是同一种类型。

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图5

  1. //byte uint8 的别称
  2. //rune int32 的别称
  3. var i3 uint8
  4. i3= 100
  5. var i4 byte
  6. i4=i3
  7. fmt.Println(i3,i4) //100,100

字符串

字符串的概念就是多个byte的集合,一个字符序列用双引号””,或者`` (esc下面的键) 表示。

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图6

  1. s1 := "ABC"
  2. fmt.Printf("s1的类型是%T,值为%s\n", s1, s1) //string ,ABC
  3. v1 := 'A'
  4. v2 := "A"
  5. fmt.Printf("v1的类型是%T,%d\n", v1, v1) // int32 65
  6. fmt.Printf("v2的类型是%T,%s\n", v2, v2) //string A
  7. //单引号存储的是 ASCII编码
  8. //A的ASCII值=65
  9. //B的ASCII值B=66
  10. //a的ASCII值a=97
  11. v3 := '中'
  12. fmt.Printf("%T,%d,%c,%q\n", v3, v3, v3, v3) //int32 20013 中 ‘中’
  13. //定义字符串
  14. s3 := "hello 漫画go语言"
  15. s2 := `hello go`
  16. fmt.Printf(s3) //hello 漫画go语言
  17. fmt.Printf(s2) //hello go
  18. //字符串的长度
  19. //中文占3个字节
  20. fmt.Println(len(s3)) //20
  21. fmt.Println(len(s2)) //8
  22. //获取某个字节
  23. fmt.Println(s2[0]) //104

字符转义

双引号单引号如果作为字符串输出,需要使用\"进行转义后才能使用 \n \r \t 为特殊作用字符。

  1. //字符转义空格
  2. fmt.Println("hello \t golang")
  3. //hello golang
  4. //输出换行
  5. fmt.Println("hello \n golang")
  6. //hello
  7. // golang
  8. //回车符号
  9. fmt.Println("hello \r golang")
  10. //hello
  11. // golang
  12. //输出路径
  13. fmt.Println("E:\\golang\\go.jpg")
  14. //E:\golang\go.jpg
  15. //双引号
  16. fmt.Println("hello \"golang\"")
  17. //hello "golang"

布尔

一个布尔类型的值只有两种结果,true或者false 非真即假。往往使用在条件判断的时候。

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图7

  1. //布尔类型作为条件比较返回结果只有true和false两种
  2. a:=10
  3. fmt.Println(a==2) //false
  4. fmt.Println(a!=2) //true

浮点型

Go语言有两种精度的浮点数 float32 和 float64。浮点类型的数据取值范围可以从很小或者很巨大。

单精度 浮点类型 取值范围
float32 负数时 -3.402823E38 到 -1.401298E-45
float32 正数时 1.401298E-45 到 3.402823E38
双精度 浮点类型 取值范围
float64 -1.79E+308 到 +1.79E+308

1.79E-308 是 1.79 乘以 10的负308次方。 1.79E+308 是 1.79 乘以 10的308次方。

单精度双精度两者区别

在内存中占有的字节数不同
  • 单精度浮点数在机内占4个字节。
  • 双精度浮点数在机内占8个字节。
有效数字位数不同
  • 单精度浮点数 有效数字7位。
  • 双精度浮点数 有效数字16位。
使用情况区别
  • 一般用来表示美元和分的时候用单精度类型。
  • 超出人类经验的数字函数,例如 sin() cos() tan() sqrt() 都使用双精度值。

数据类型的转换

go 语言是静态语言,要求,定义、赋值、 运算、类型一致才能进行操作。所以要进行操作的时候必须保证数据类型一致。需要注意的是,只有兼容的数据类型才能够转换。 强制类型转换的语法 Type(value)

  1. var a int8 = 10
  2. var b int16
  3. //b=a 因为类型不同不能直接转换
  4. b= int16(a)
  5. fmt.Println(a,b)//10,10
  6. f1:=3.12
  7. var c int
  8. c = int(f1)
  9. fmt.Println(f1,c)// 3.12 , 3 浮点类型转为整形的时候 只是取了整数部分
  10. //不是所有类型都能互相转换
  11. //数值类型的可以转换 int 和bool 不能转换

运算符

算数运算符 程序在运行过程中执行数学运算时候需要算数运算符。

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图8

运算符 描述 说明
+ 表示相加 5+2 =7
- 相减 5-2 =3
* 相乘 5*2 =10
/ 相除 取商 5/3 = 1
% 相除 取余数 5%3= 2
++ 自身加1 5++ =6
-- 自身减1 5— =4

关系运算符 关系运算符的结果是bool类型的

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图9

运算符 描述 说明
== 比较相等 10==10 结果 true
!= 比较不等 10 !=10 结果 false
是否大于 100>1 结果 true
< 是否小于 100<1 结果 false
>= 大于等于 100>=100 结果 true
<= 小于等于 100>=101 结果 false

逻辑运算符

标识符 描述 说明
&& 逻辑与 操作数都为真才为真 有一个为假就为假(一假则假,全真为真)
II 逻辑或 操作数有一个为真就为真(一真为真,全假为假)
! 逻辑非 相反方向则为真(假为真 真为假)

位运算符

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图10

  1. var a int8 = 12
  2. var b int8 = 15
  3. fmt.Printf("%b,%b \n", a, b)
  4. //0000 1100 a 的二进制
  5. //0000 1111 b 的二进制
  6. //0000 1100 按位与 & --转为10进制 结果 12
  7. //0000 1111 按位或 | --转为10进制 结果 15
  8. //0000 0011 按位异或 ^ --转为10进制 结果 3
  9. //0000 0000 按位清空 &^ --转为10进制 结果 0
  10. //<< 按位左移 a << b 将a转为二进制 向左移动b个位
  11. //>> 按位右移 a >> b 将a转为二进制 向右移动b个位
  12. aes := a << 2
  13. //0011 0000 a向左位移2位结果
  14. fmt.Printf("%b\n", aes)
  15. aes2 := a >> 2
  16. //0000 0011 a向右位移2位结果
  17. fmt.Printf("%b\n", aes2)

赋值运算符

运算符 描述
\= 把等号右侧的数值 赋给左边的变量
+= 自身加上后面的值 再赋给左边的变量
-= 自身减去后面的值 在赋给左边
/= 自身除后面的值 再赋值给左边
%= 自身与后面的值求余数后 再赋值给左边
<<= 左移后再赋值
>>= 右移后再赋值
&= 按位与后再赋值
I= 按位或 后再赋值
^= 按位异或后再赋值

占位符号

占位符表示在程序中输出一行字符串时候,或者格式化输出字符串的时候使用。go内置包fmt中Printf方法可以在控制台格式化打印出用户输入的内容。fmt.Printf(“%T”,x)

3 Go小二的刀枪剑棘斧钺钩叉-- 数据类型 - 图11

占位符 说明 举例 输出
%d 十进制的数字 fmt.Printf(“%d”,10) 10 %b 二进制的数字 fmt.Printf(“%b”,5) 101
%T 取类型 b :=true fmt.Printf(“%T”,b) bool
%s 取字符串 s :=”123” fmt.Printf(“%s”,s) 123
%t 取bool类型的值 b:=true fmt.Printf(“%t”,b) true
%p 取内存地址 p :=”123” fmt.Printf(“%p”, &p) 0xc0000461f0