go语言array与slice

array与slice

array和slice定义

注意

(1)可以看出slice是可以随心所欲的表示一个数组上的一个或者一段元素,更关键的是slice不是一个值类型,而是一个引用类型,就好比指针一样,对slice取得的元素进行写操作实际是影响到了底层的数组层,slice真的只是一层薄薄的操作封装罢了。因此,slice有一个重要的用途就是作为函数的参数,就这可以避免直接传递数组而导致整个数组发生一次内存拷贝。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main  

import "fmt"

func main() {
a := []int{0,1,2,3,4,5,6,7,8,9}
s := a[0:5]

Print(a, "a")
Print(s, "s")

s1 := append(s, 0)
fmt.Printf("=================\n")

Print(a, "a")
Print(s, "s")
Print(s1, "s1")
}

func Print(o []int, name string) {
fmt.Printf("%s: ", name)

for _, v := range o {
fmt.Printf("%d ", v)
}

fmt.Printf("\n")
}

1
2
3
4
5
6
7
输出结果为:
a: 0 1 2 3 4 5 6 7 8 9
s: 0 1 2 3 4
=================
a: 0 1 2 3 4 **0** 6 7 8 9
s: 0 1 2 3 4
s1: 0 1 2 3 4 0

(2)使用range遍历数组时,实际上是数组的copy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import "fmt"

func main() {
arr := [5]int {1, 2, 3, 4, 5}
fmt.Println(arr)

for _, item := range arr {
item += 10
}
fmt.Println(arr)

n := len(arr)
for i := 0; i < n; i ++ {
arr[i] += 10
}
fmt.Println(arr)
}

/*
* 运行结果
* [1, 2, 3, 4, 5]
* [1, 2, 3, 4, 5]
* [11, 12, 13, 14, 15]
* 为什么第一个循环没有改变原数组呢?
*/