需要掌握的知识点
1、数组不可边长 2、如何声明数组 3、如何初始化数组 4、如何给数组赋值 5、如何获取数组的值 6、如何给数组排序 7、如何遍历数组 8、如何窃取数组里面的一段值 9、查看容量和长度 (容量和长度相等)
声明数组
package main
import "fmt"
func main(){
var a [10]string
fmt.Println(a)
}
初始化数组
package main
import "fmt"
func main(){
var a = [3]string{"1","2"}
fmt.Println(a)
}
package main
import "fmt"
func main(){
var array = make([]string,10,20) //
fmt.Println(array)
fmt.Printf("长度: %d \n", len(array))
fmt.Printf("容量: %d \n",cap(array))
}
说明 make 是一个内建函数 第一个参数类型,第一个参数容量,第三个参数长度,
image.png
加入我们将10 和 20 调换一下,编译会不会报错,运行会不会报错? 编译不会报错,因为参数数据类型是正确的,编译会报错,因为容量不能大于长度
如果我们初始化切片的时候不指明长度那么系统会自动将长度的值设置和容量一样
再看一个例子
package main
import "fmt"
func main(){
array := []int{1,2,3,4,5,6,7,8,9,10}
s1 := array[3:6]
fmt.Printf("长度:%d\n",len(s1))
fmt.Printf("容量:%d\n",cap(s1))
}
数据类型
[3:6] 其实对应区间表达式是[3:6) 所以它的数据长度为 3,容量为7,数据长度3比较好理解即3,4,5三个元素的个数,但是容量7怎么解释呢?切片s1底层的数组是array,它的内存其实地址是位置3所在的位置,那么它的结束位置就是数组array的最后一个元素位置,则10-3 = 7
image.png
如何把切片s1 容量最大化
package main
import (
"fmt"
)
func main(){
array := []int{1,2,3,4,5,6,7,8,9,10}
s1 := array[1:4]
s1 = s1[0:cap(s1)]
fmt.Printf("长度:%d\n",len(s1))
fmt.Printf("容量:%d\n",cap(s1))
fmt.Println(s1)
}
image.png
如果我修改了array中的4改成5,那么s1的值会变吗?什么情况下会不变呢?
答案 :会,因为他们是同一个内存区域!
package main
import (
"fmt"
)
func main(){
array := []int{1,2,3,4,5,6,7,8,9,10}
s1 := array[1:6]
s1 = append(s1,0)
s1 = append(s1,0)
s1 = append(s1,0)
s1 = append(s1,0)
s1 = append(s1,0)
s1 = append(s1,0)
fmt.Printf("长度:%d\n",len(s1))
fmt.Printf("容量:%d\n",cap(s1))
array[3] = 5
fmt.Println(s1)
}
image.png
两个地方解释一下
容量为什么是18呢?
s1底层的内存其实和array是共享的,当s1的长度超过容量是,那么系统会自动为它分配两倍大的内存空间作为它的最新内存
有几个特殊的事项需要注意
1.如果一次给切片追加的元素太多,长度大于容量的两倍,那么新的切片的容积就等于实际元素的数量 2.如果切片长度大于或者等于1024,go语言会以原容量的1.25倍进行扩容 3.append 返回的切片是一个新的切片,如果长度没有超过,那么新的切片的底层数组就是原来的底层数组