内部实现
- 数组
数组是一个长度固定的数据类型,用于存储一段具有相同类型的元素的连续块。数组存储的类型可以是内置类型,如整型或者字符串,也可以是某种结构类型。 - 切片
切片是围绕动态数组的概念构建的,可以按需自动增长和缩小
切片是一个很小的对象,对底层数组进行了抽象,并提供了相关的操作方法。切片有3个字段分别是指向底层数组的指针
,切片访问的元素个数(即长度)
和切片允许增长到的元素个数(即容量)
声明和初始化
- 数组
//声明一个包含5个元素的整型数组,并设置为零值 var array [5]int //使用数组字面量声明数组 array := [5]int{10,20,30,40,50} //隐式声明数组长度 array := [...]int{10,20,30,40,50} //声明数组并指定特定元素 array := [5]int{0:10,2:30}
- 切片
//使用make //长度和容量都是5个元素 slice := make([]string, 5) //长度为3,容量为5个元素 slice := make([]int, 3, 5) //使用字面量声明 //长度和容量都是4个元素 slice := []string{"red","blue","green","yellow"} //声明切片 并指定特定元素 长度容量都是100 slice := []string{99:"!!"}
赋值
- 数组
func main() { var array1[5]string array2:=[5]string{"Red","Blue","Green","Yellow","Pink"} //把array2的值复制到array1 array1=array2 array1[0] = "Black" fmt.Println(array1) fmt.Println(array2) }
如图数组赋值仅仅是复制数组的值
- 切片
切片赋值,仅仅是复制切片的指针、长度和容量func main() { slice := []int{1,2,3,4,5} slice2 := slice slice2[1] = 100 fmt.Println(slice) fmt.Println(slice2) }
函数传递
- 数组
在函数之间传递变量时,总以值的方式传递的func test(arr [3]int) { arr[2] = 300 } func test1(arr *[3]int) { arr[1] = 200 } func main() { arr := [...]int{1,2,3} fmt.Println(arr) test(arr) fmt.Println(arr) test1(&arr) fmt.Println(arr) }
- 切片
在函数间传递切片就是要在函数间以值的方式传递切片
在64位机上,一个切片需要24字节的内存,指针x8,长度和容量x8,由于与切片关联的数据包含在底层数组里,不属于切片本身,所以将切片复制到任意函数的时候,对底层数组的大小都不会有影响。复制时只会复制切片本身,不会涉及到底层数组func test(slice []int) { slice[1] = 100 } func main() { slice := []int{1,2,3,4,5} test(slice) fmt.Println(slice) }
网友评论