数组和切片

一.数组


Go语言的数组也是一个元素类型相同的定长的序列

1.创建
A.创建方式1:

var iarray1 [5]int // 声明数组,自动赋值所有成员为0
iarray1 = [5]int32{1, 2, 3, 4, 5}
var iarray2 [5]int = [5]int32{1, 2, 3, 4, 5} //声明并初始化

  

B.创建方式2:

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

C.创建方式3:

iarray5 := [...]int{11, 12, 13, 14, 15}

  

2.数组的长度和容量
len(array)和cap(array)求值,两者一致.

 

3.遍历数组

for k, v := range iarray {
		fmt.Println(k, v)
}

  

二.切片

切片是长度可变、容量固定的相同的元素序列

1.创建

A.方式1:
make ( []Type ,length, capacity )

B.方式2:
make ( []Type, length)

C.方式3:
[]Type{}

D.方式4:
[]Type{value1 , value2 , ... , valueN }

  

除了make外,创建切片和数组唯一的区别是,Type 前的“ [] ”中是否有数字,为空,则代表切片,否则则代表数组.

 

2.一个切片是一个隐藏数组的引用

arr1 := []int{1, 3, 3, 3, 3}
arr2 := arr1
arr2[0] = 1000

fmt.Println(arr1, arr2)

  

// arr2更改值后,arr1也被更改了;数组则不会有此特性

3.遍历/修改切片

func main() {
	arr1 := []int{1, 3, 3, 3, 3}
	arr1[0] = 1000
	for k, v := range arr1 {
		fmt.Println(k, v)
	}
}

  

4.追加/复制切片

append:

func main() {
	arr1 := []int{1, 3, 3, 3, 3}
	arr2 := append(arr1, 15, 20)
	for k, v := range arr2 {
		fmt.Println(k, v)
	}
}

  

copy:

func main() {
	arr1 := []int{1, 3, 3, 3, 3}
	arr2 := make([]int, 2)
	copy(arr2, arr1) // 将arr1复制到arr2中,两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制
	arr2[0] = 500
	fmt.Println(arr1, arr2)
}

  

三.数组和切片作为函数参数

1.数组作为参数

func Handle(arr [2]int) {
	arr[0] = 100
}

func main() {
	arr1 := [2]int{1, 52}
	Handle(arr1)
	fmt.Println(arr1)
}

  

// 参数传递是对数组的复制,Handle改变的是arr1的一个副本,不会对arr1有影响

 

2.切片做参数

func Handle(arr []int) {
	arr[0] = 100
}

func main() {
	arr1 := []int{1, 52}
	Handle(arr1)
	fmt.Println(arr1)
}

  

切片是一个引用,Handle改变了arr1的元素.

Go语言的函数调用参数全部是传值的, 包括 slice/map/chan/inerface 在内所有类型.slice/map/chan/interface传递了引用.

 

  

 

posted @ 2017-10-08 21:59  rorshach  阅读(687)  评论(0编辑  收藏  举报