五、数组、切片和字典
1.数组:
定义方式:
固定长度:
var x [5] int
初始情况下是空值。
这是定义固定长度的。
然后
x[0] = 1
x[1] = 2
x[2] = 3
x[3] = 4
x[4] = 5
一个个赋值
不限制长度:
var x = [...] int { 1, 2, 3}
这种情况必须有初始数据
// 两种遍历方式 package main import ( "fmt" ) func main() { var a = [...] int {1, 2, 3} fmt.Println(len(a)) // 遍历方式一 for _, i := range(a) { fmt.Println(i) } // 遍历方式二 for i := 0; i < len(a); i ++ { fmt.Println(a[i]) } }
2.切片
顾名思义,就是从数组切下来的一块,下标同样是从0开始的,类似C++中的容器,长度不固定。
有两个属性:
容量(capacity)和长度(length)
两种定义方式:
先声明,然后用make去初始化
// 第一种定义方式 // make(元素类型,len,capacity var x = make([]int, 5, 10) for i := 0; i < len(x); i++ { x[i] = i } fmt.Println(cap(x)) fmt.Println(len(x)) fmt.Println(x) // 直接从数组切下来一块
// 第二种定义方式 // 截取格式 y[low_index : high_index] 截取区间[low_index, high_index] var y = [5]int{1, 2, 3, 4, 5} var s1 = y[1:2] var s2 = y[:2] var s3 = y[1:] var s4 = y[:] fmt.Println(s1) fmt.Println(s2) fmt.Println(s3) fmt.Println(s4)
append函数给切片增加元素:
例如:
var s1 = append( [] int {1, 2, 3}, 4, 5, 6}
s1 此时为 [1, 2, 3, 4, 5, 6]
内存的变化和C++中的vector类似:因为切片需要随机访问,所以需要一段连续的空间,如果元素数超过capacity,那么就会重新开辟一段新的空间,将元素复制过去。
3.字典
类似C++标准库中的map,有一对 键值对 {key, value}key 就相当于索引.
两种定义方式:
初始化数据:
// 实际上就是初始化数据嘛 var x = map[string]string{ "A": "Apple", "B": "Banane", "O": "Orange", "P": "Pear", }
通过make函数初始化:
var y map[string]string y = make(map[string]string) y["A"] = "Apple" y["B"] = "Banana" y["O"] = "Orange" y["P"] = "Pear"
遍历:
for key, val := range x { fmt.Println("Key:", key, "Value:", val) }
如果对key或者value 的返回值不感兴趣,可以用_代替
for _, val := range x { fmt.Println("Value:", val) }
另外map支持随机访问,例如fmt.Println(x[“A”]) ,如果key没有对应的value那么值为空。
删除:
delete(x, “A”)
删除key为”A”的键值对
我每天都在努力,只是想证明我是认真的活着.