Go语言基础(2)数据类型 | 青训营笔记

114 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

Go语言的数据类型有很多,数字类型、布尔类型、字符串类型、数组类型、切片类型,指针类型、结构体类型、Map类型等等。

整数

整数是一种比较常见的数据类型,支持8, 16, 32, 64位的整数和无符号整数,还有 intuintuintptr 类型。在实际的使用中,经常会简单实用 int 类型来存储整数,对于特殊的场景可以灵活使用各种大小的整数类型。

类型描述
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)
int32位操作系统上就是int32,64位操作系统上就是int64
uint32位操作系统上就是uint32,64位操作系统上就是uint64
uintptr无符号整型,用于存放一个指针

浮点数

浮点数类型一共支持两种:float32float64 。这两种浮点数都遵循 IEEE 754 标准。

类型描述
float32单精度浮点数,最大数值 3.4e38,最小数值 1.4e-45
float64双精度浮点数,最大数值 1.8e308,最小数值 4.9e-324

参考示例:取最大值

var floatNumber float32 = math.MaxFloat32
var doubleNumber float64 = math.MaxFloat64

数组

在Go语言中,数组是一个定长的数据结构,在实际使用中比较少的, 使用比较多的是叫做切片的数据类型。

  • 直接通过 var 关键字声明一个数组
  • 通过 := 声明并定义一个数组
  • 数组支持声明多维数组
var a [5]int				// var 关键字声明数组
b := []int {1, 2, 3, 4, 5}	// 预先知道值的数组
c := [5][5]int				// 多维数组

// 一维数组
a[4] = 100
fmt.Println("Array's value of index of 2 is ", a[2])
fmt.Println("Array's length is ", len(a))
// 多维数组
for i := 0; i < 5; i++ {
    for j := 0; j < 5; j++ {
        c[i][j] = i + j
    }
}
fmt.Println("Two dimension array: ", c)

切片

切片在Go语言中是非常非常重要的数据类型,数组由于其特性,数组的大小是有限的,因此有一个灵活确定大小的数据类型就很方便,切片就可以充当这样的数据类型,切片的操作主要有:

  • 创建切片:make([]string, 3)
  • 使用切片:slice[1] = 1
  • 切片值的追加:newSlice = append(slice, "1", "2")
  • 切片的复制:copy(src, dest)
  • 切片操作:s[2:5]
// 创建一个切片
s := make([]string, 3)
// 使用切片
s[0] = "a"
s[1], s[2] = "b", "c"
fmt.Println("slice s get index 2: ", s[2])
fmt.Println("slice s length is ", len(s))
// 切片值追加
s = append(s, "d", "e", "f")
// 切片的复制
c := make([]string, len(s))
copy(c, s)
// 切片操作
fmt.Println("c[2:5] = ", c[2:5])

map

map 可以用于存储键值对类型的数据。map 在程序的使用非常普遍,map的操作通常包含:

  • 创建一个 mapmake(map[string]int) 或者 直接创建
  • map 增加/修改键值对:m["one"] = 1 增加和修改一个键值对的语法是完全一致的
  • 获取一个键值对:val, ok := m["one"] 获取一个键值对的时候,还会接收到一个参数 ok 用于判断是否存在这个键值对。
  • 删除一个键值对:delete(map, key) 删除键值对需要使用 map 和对应的值直接就可以对他进行删除
// 创建一个 map
m := make(map[string]int)	// 通过 make() 创建
m1 := map[string]int {"one":1,"two": 2}	// 直接根据值创建
// 新增或者修改键值对
m["one"] = 1
m["one"] = 1001
// 获取键值对
val, ok := m["one"]
// 删除键值对
delete(m1, "one")

遍历工具:range

range 搭配循环使用可以很方便的遍历例如数组、map、切片这样的数据类型的数据。

// 数组 / 切片
nums := []int {1, 2, 3, 4}
for i, val := range nums {
    fmt.Println("nums[", i, "] = ", val)
}
// map
for k, v := range m {
    fmt.Println("m[\"", k, "\"] = ", v)
}
  • 对于数组的数据类型来说,range 返回两个数据:下标和值
  • 对于 map 的数据类型来说,range 返回两个数据:键和值
  • map 数据类型,每次遍历的结果都是随机的