数据类型简介(上) | 青训营

151 阅读5分钟

数据类型

在 Go 编程语言中,数据类型用于声明函数和变量。

数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。

Go 语言按类别有以下几种数据类型:

序号类型和描述
1布尔型 布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true
2数字类型 整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
3字符串类型: 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
4派生类型: 包括:- (a) 指针类型(Pointer)- (b) 数组类型- (c)结构化类型(struct)- (d) Channel 类型- (e) 函数类型- (f) 切片类型- (g) 接口类型(interface)- (h) Map 类型

复合数据类型

数组和切片 (Array & Slice)

数组是一个固定大小的数据结构,它包含一组相同类型的元素。在 Go 语言中,创建数组时,需要指定数组的大小,并且该大小在声明后无法改变。数组的大小是其类型的一部分,因此类型为 [size]dataType ,其中 size 表示数组大小, dataType 表示数组元素的数据类型。

数组是值类型,当将一个数组赋值给另一个数组时,会复制所有的元素。这意味着对于大型数组,复制操作可能会比较耗时和内存。

// 声明一个包含5个整数的数组
var numbers [5]int

// 初始化数组元素
numbers = [5]int{1, 2, 3, 4, 5}

// 声明并初始化一个数组
numbers := [5]int{1, 2, 3, 4, 5}

切片是对数组的引用。切片不需要指定大小,可以动态增长和收缩。在声明切片时,不需要指定大小,只需要指定元素的类型。

对切片的修改会影响到底层数组。当将一个切片赋值给另一个切片时,它们会引用相同的底层数组。

// 声明一个切片
var mySlice []int

// 使用 make() 函数创建切片,第一个参数是切片类型,第二个参数是切片长度,第三个参数是切片容量(可选)
mySlice = make([]int, 5)    // 长度为5,容量也为5的切片

// 初始化一个切片
mySlice = []int{1, 2, 3, 4, 5}

// 切片的动态增长
mySlice = append(mySlice, 6, 7, 8) // 添加元素到切片末尾

需要注意的是,切片本身并不存储数据,它只是一个引用,指向底层数组的一部分。当切片的容量不足时,底层数组会被自动扩容。

你可以创建一个新的切片,它引用了现有切片或数组的一部分。这被称为“切片的切片”。切片的切片的语法是 slice[start:end],其中 start 是第一个元素的索引(包括),end 是最后一个元素后面的索引(不包括)。结果切片的长度是 end - start,容量是从 start 索引到底层数组末尾的元素数量。

// 切片的切片,获取子切片
subSlice := mySlice[2:5] // 这将创建一个从索引 2 到索引 4(不包括 5)的子切片

映射(Map)

在Go中,映射(Map)是一种键值对的无序集合,类似于Python中的字典(dict)。它提供了一种方便的方式来存储和检索键值对,并且允许根据键快速查找对应的值。

创建映射(Map)

在Go中,使用map[keyType]valueType的语法来声明一个映射。其中keyType表示键的数据类型,valueType表示值的数据类型。

// 声明一个映射,键为字符串类型,值为整数类型
var myMap map[string]int

初始化映射

使用make()函数来初始化一个映射。初始化映射后,才能对其进行赋值和操作。

// 初始化一个映射
myMap := make(map[string]int)

添加和更新键值对

可以使用赋值操作符(=)来添加或更新映射中的键值对。如果指定的键不存在,它将被添加到映射中;如果指定的键已经存在,它将更新对应的值。

myMap["apple"] = 10
myMap["banana"] = 5
myMap["apple"] = 15 // 更新键 "apple" 对应的值

访问和检查键值对

可以通过指定键来访问映射中的值。如果指定的键不存在,将返回值类型的零值。为了区分键不存在和值为零值两种情况,可以使用多返回值的方式来检查键是否存在。

value := myMap["apple"] // 访问键 "apple" 对应的值

// 检查键是否存在
value, exists := myMap["orange"]
if exists {
    fmt.Println("The value for 'orange' is:", value)
} else {
    fmt.Println("Key 'orange' does not exist.")
}

删除键值对

可以使用delete()函数来删除映射中的键值对。如果指定的键不存在,delete()函数不会产生错误。

delete(myMap, "banana") // 删除键 "banana" 对应的键值对

遍历映射

使用for range循环可以遍历映射中的所有键值对。

for key, value := range myMap {
    fmt.Println(key, value)
}

Go 中的映射是一个强大且方便的数据结构,它在许多场景下都非常有用,特别是用于表示键值对的集合。与 Python 中的字典类似,Go 的映射提供了快速的键值查找和更新,是处理键值对数据的理想选择。