Go语言内置 7 类数据类型,(20个具体子类型)

布尔型

布尔型的关键字是bool,只有两个值truefalsetruefalse是Go内置的两个预声明标识符。

  1. // 声明bool型变量
  2. var ok bool
  3. ok = true
  4. // 布尔型和整型数据不能相互比较
  5. var a int = 1
  6. var b bool = true
  7. a == b // ❌ 不能进行比较
  8. // 比较表达式和逻辑表达式的结果都是布尔型数据
  9. var b bool = (x > y) && (x > 0)
  10. // 声明布尔型变量如果不指定初始值,则默认为false
  11. var b bool // b == false

整型

Go语言中内置了12中整型类型,分别是:byteintint8int16int32int64uintuint8uint16uint32uint64uintptr。其中byteuint8的别名,不同类型的整型必须进行强制类型转换。

  1. // 有符号整型
  2. int8 // -128~127
  3. int16 // -32768~32767
  4. int32 // -2147483648~2147483647
  5. int64 // -9223372036854775808~9223372036854775807
  6. // 无符号整型
  7. uint8 // 0~255
  8. uint16 // 0~65535
  9. uint32 // 0~4294967295
  10. uint64 // 0~18446744073709551615
  11. // 取决于系统位数
  12. int
  13. uint
  14. // 特殊类型
  15. uintptr // 无符号整型,由系统决定占用位大小,足够存放指针即可,和C库或者系统接口交互
  16. var a int = 1
  17. var b int32 = 2
  18. b = a // 不同类型的整型必须进行强制转换
  19. // 整型支持算术运算和位操作
  20. var a int = (1 + 2) * 3
  21. var b int = 1000>>2

浮点型

Go语言中设置两个浮点数类型,分别是float32float64

  • 浮点型字面量被自动类型推断为float64
  • 计算机很难进行浮点数的精确表示和比较,因此两个浮点数之间不应该使用==!= 进行比较操作。
  • 浮点型数据在内存中的分配

image.png

  1. var b := 10.00 // float64 10.00

复数类型

Go语言内置的复数烈性有两种,分别是complex64complex128,复数在计算机里面使用2个浮点数表示,一个表示实部一个表示虚部。

  1. var value complex128 = 3.1 + 5i
  2. value1 != 3.2 + 6i
  3. // Go有三个内置函数处理复数
  4. var v = complex(1.2, 3) // 构造一个复数
  5. a := real(v) // 返回复数实部
  6. b := imag(v) // 返回复数虚部

字符串

  1. 字符串是常量,可以通过类似数组的索引访问其字节单元,但是不能修改某个字节的值
  2. 字符串转换为切片 []byte 要慎重,尤其是当数据量较大时(每次转换都需赋值内容)
  3. 字符串尾部不包含NULL,这一点和C/C++不一样
  4. 字符串类型底层实现是一个二元的数据结构,一个是指针指向字节数组的起点,另一个是长度
  5. 基于字符串创建的切换和原字符串指向相同的底层字符数组,一样不能修改,对字符串的切片操作返回的子串仍然是string ,而非 slice
  6. 字符串和切片的转换:字符串可以转换为字节数组,也可以转换为Unicode的字数组 ```go // 定义一个字符串 var a = “hello world”

b := a[0] // 通过索引访问字节单元 a[1] = “m” // ❌ 不能修改某个字节的值

s := []byte(a) // 字符串转换为字节数组

// 字符串的slice操作 c := a[0, 4] d := a[1:] e := a[:4]

// 字符串拼接 f := d + e; len(f) // 使用len函数计算字符串长度

g := “hello, 世界” for i :=0;i<len(g);i++ { // 遍历字节数组 fmt.Println(d[i]) }

for i, v := range g { // 遍历rune数组 fmt.Println(i, v) } ```