五、数组、切片和字典

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”的键值对

posted @ 2018-05-09 17:42  勿忘初心0924  阅读(372)  评论(0编辑  收藏  举报