博客 记录生活,记录工作。

golang基础-01-array、slice和map

2018-11-22
gongmh
go

1. array

1.1 声明数组

数组具有特定的长度和元素类型类型,如上面intArr是长度为5的元素类型int的数组。

var intArr [5]int
fmt.Println(intArr)         //output: [0 0 0 0 0]

数组默认具有零值,例如int即为0等。

1.2 声明并初始化数组

intArrNew := [5]int{1, 2, 3, 4, 5}
fmt.Println(intArrNew)         //output: [1 2 3 4 5]

1.3 获取数组长度

通过golang内置函数len()

fmt.Println(len(intArr))    //output: 5

1.4 数组元素存取

通过索引获取或修改数组的值

intArr[1] = 100
fmt.Println("set:", a)      //output: set: [0 100 0 0 0]
fmt.Println("get:", a[4])   //output: get: 100

1.5 多维数组

var twoDArr [2][3]int
for i := 0; i < len(twoDArr); i++ {
    for j := 0; j < len(twoDArr[i]); j++ {
        twoDArr[i][j] = i + j
    }
}
fmt.Println(twoDArr)        //output: [[0 1 2] [1 2 3]]

2. slice

slice在golang中应用更加广泛。

2.1 声明slice

声明slice类似声明数组,但是不需要支持元素的数量,如下所示。

var intSlice []int

2.2 声明并初始化slice

intSliceNew := []int{1, 2, 3, 4, 5}

2.3 slice元素存取

新声明的slice没有指向存储空间,直接为slice赋值,会报panic。 需要为slice分配空间,然后使用。

//1. 分配空间前
// intSlice[1] = 10            // panic: runtime error: index out of range
fmt.Printf("slice addr: %p, value:%v \n", intSlice, intSlice)
// slice addr: 0x0, value:[]

//2. 分配空间
intSlice = make([]int, 1, 2)
fmt.Printf("slice addr: %p, value:%v \n", intSlice, intSlice)
// slice addr: 0xc0000166a0, value:[0]

//3. 通过index设置
intSlice[0] = 13
fmt.Println(intSlice[0])
fmt.Printf("slice addr: %p, value:%v \n", intSlice, intSlice)
// slice addr: 0xc0000166a0, value:[13]

//4. 未超过容量前,通过append追加
intSlice = append(intSlice, 14)
fmt.Printf("slice addr: %p, value:%v \n", intSlice, intSlice)
// slice addr: 0xc0000166a0, value:[13 14]

//5. 超过容量后,通过append追加
//intSlice[2] = 13            // panic: runtime error: index out of range
intSlice = append(intSlice, 12)
fmt.Printf("slice addr: %p, value:%v \n", intSlice, intSlice)
// slice addr: 0xc000018280, value:[13 14 12]

上面我们可以看到slice的存取可以使用类似数组的方法,通过索引来操作。

但是,slice在未申请存储空间前,以及申请存储后越界访问,都会报panic

golang内置的append可以对slice做追加,当slice有足够的存储空间是,返回的还是之前的slice,但是当append超过slice的容量时,会生成一个新的slice返回。因此使用append方法追加的时候,需要接收append的返回值。

通过查看slice的地址,可以看到超过容量以后,再给slice追加,slice的地址从0xc0000166a0变为了0xc000018280

2.4 slice的长度

通过golang内置函数len()

fmt.Println(len(intSlice))    //output: 3

2.5 多维slice

var twoDSlice [][]int
twoDSlice = make([][]int, 3)
for i := 0; i < len(twoDSlice); i++ {
    twoDSlice[i] = make([]int, 2)
    for j := 0; j < len(twoDSlice[i]); j++ {
        twoDSlice[i][j] = i + j
    }
}
fmt.Println(twoDSlice)        //output: [[0 1] [1 2] [2 3]]

3. map

3.1 map声明

var m map[string]int

3.2 声明并初始化map

mNew := map[string]int{
    "key1": 10,
    "key2": 11,
}

3.3 map的存取

和slice一样,在使用map前需要分配存储空间,否则会报panic。

//1. 分配空间前
//m["key1"] = 10       // panic: assignment to entry in nil map

//2. 分配空间
m = make(map[string]int)

//3. 设置值
m["key1"] = 10
m["key2"] = 20
fmt.Println(m, len(m))           // map[key1:10 key2:20] 2

//4. 获取值
value1 := m["key1"]
fmt.Println("value1:", value1)    // value1: 10
fmt.Println(m, len(m))            // map[key1:10 key2:20] 2

_, exist := m["k2"]
fmt.Println("exist:", exist)      // exist: false

//5. 删除值
delete(m, "key2")
fmt.Println(m, len(m))    // map[key1:10] 1

获取map对应key的value时,除了返回key对应的value,还会返回一个可选的返回值,表示key是否在map中存在。

当key存在时,可选返回值为true;当key不存在,可选返回值为false,返回的value为对应的零值。

3.4 map的长度

fmt.Println(len(m))    //output: 1

相关博文

评论