Go学习笔记
目录
Go语言基础
数组Array
数组是同一种数据类型元素的集合。 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。
数组的定义:
var 数组变量名 [元素数量]类型(如: var a [3]int )数组的长度必须是常量, 并且长度是数组类型的一部分。一旦定义, 长度不能变。
数组可以通过索引进行访问,但是不能超过数组元素最大索引,否则会引发
panic
数组定义
| |
数组初始化
| |
数组遍历
- 数组遍历可使用 for 循环与 for range 循环进行遍历
| |
多维数组
- 多维数组既,数组中嵌套数组
- 多维数组只有最外层数组可以使用[…]动态配置数组长度
- 数组是值类型, 赋值和传参会复制整个数组. 因此改变副本的值, 不会改变本身的值。
| |
数组练习题
| |
切片Slice
切片 (Slice) 是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。
切片 (slice) 是一个
引用类型, 它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。切片 (slice) 定义了以后, 必须初始化才能使用。
切片 (slice) 不能直接进行比较, 切片只能和
nil进行比较.nil的切片元素个数与容量都为 0。
切片定义
var 变量名 []元素类型.
| |
切片本质
- 切片的本质就是对底层数组的封装, 它包含了三个信息: 底层数组的指针、切片的长度(len)和切片的容量(cap)。
| |
切片比较
| |
切片的赋值
- 切片是 引用类型
| |
切片的遍历
- 切片的遍历方式和数组是一致的, 支持索引
for遍历和for range遍历。
| |
append()
- Go语言的内建函数
append()可以为切片动态添加元素。 每个切片会指向一个底层数组, 这个数组能容纳一定数量的元素。当底层数组不能容纳新增的元素时, 切片就会自动按照一定的策略进行"扩容”, 此时该切片指向的底层数组就会更换。“扩容"操作往往发生在append()函数调用时.
| |
切片扩容策略
- 切片容量长度小于1024时, 每次扩容的新容量就是旧容量的2倍。
- 如果新扩容的容量大于旧容量的2倍, 那么旧容量就等于新扩容的容量。
- 如果切片容量长度大于1024时,扩容的新容量是旧容量的1/4, 直到最终容量大于等于新申请的容量。
- 另外不同类型的切片, 扩容的策略也不相同。
copy()
由于切片是
引用类型, 所以切片(a = b) 实际指向的是同一个内存地址,修改切片b的元素时,a切片也会修改。Go语言内建的
copy()函数可以迅速地将一个切片的数据复制到另外一个切片空间中。copy()用法copy(目标切片, 原切片)。
| |
切片练习题
| |
Map
Go语言中提供的映射关系容器为
map, 其内部使用散列表(hash)实现。map是一种无序的基于key-value的数据结构, Go语言中的map是引用类型, 必须初始化才能使用。map类型的变量默认初始值为nil,需要使用make()函数来分配内存。
map定义
map[KeyType]ValueType(KeyType:表示键的类型, ValueType:表示键对应的值的类型) 如: map[string]int
| |
- 输出:
| |
map 初始化
make(map[KeyType]ValueType, [cap])如: make(map[string]int,10) , 其中cap表示map的容量, 该参数虽然不是必须的, 但是我们应该在初始化map的时候就为其指定一个合适的容量。
| |
- 输出:
| |
判断map键值对是否存在
- 使用
value,ok的方式进行判断。
| |
- 输出:
| |
map 的遍历
- 使用
for range循环遍历 map
| |
- 输出:
| |
delete() 函数
map可使用delete()内建函数 删除一组键值对,delete()函数。- 格式:
delete(map, map的key)
| |
- 输出:
| |
按照指定顺序遍历 map
- 将
map中的 key 值存到切片中,利用 sort 对切片进行排序.然后利用 map[排序后的key] 对map进行排序.
| |
切片与map结合
- 元素类型 为
map的切片,s1 = make([]map[string]int, 0, 5)。
| |
- 输出:
| |
- 元素值为切片的
map如:m8 := make(map[string][]int, 8)
| |
- 输出:
| |
Map练习题
- 统计一个字符串中每个单词出现的次数。比如: “how do you do” 中how=1 do=2 you=1。
| |
- 输出:
| |