数组的容量和长度是i样的,cap()函数和len()函数均输出数组的容量(即长度)package main
import "fmt"
func main() {
a := [5]int{6, 7, 8, 9, 10}
fmt.Println(len(a))
fmt.Println(cap(a))
}
切片
-本身并不是数组,它指向底层的数组
-作为变长数组的替代方案,可以关联底层数组的局部或全部
-为引用类型
-使用len()获取元素的个数,cap()获取容量
-一般使用make()创建
-如果多个slice指向相同底层数组,其中一个的值改变会影响全部
-make([]T,len,cap)
-其中cap 可以省略,则和len的值相同
package main
import "fmt"
func main(){
var s1[10]int
s1:=[10]int{1,2,3,4,5,6,7,8,9}
fmt.Println(s1)
s2 :=s1[:9]
s3 :=s1[4:8] //包含开始不包含结束
fmt.Println(s2)
}
使用make声明数组
s1 :=make([]int,3,9)
package main
import "fmt"
func main(){
s1 :=make([]int,3,10)
fmt.Println(s1)
}
--从一个slice取出一个新的slice
Reslice:从一个slice取出一个新的slice
Reslice时索引被slice的切片为准
索引不可以超过被slice的切片的容量cap()值
索引越界不会导致底层数组的重新分配而是引发错误
Append
可以在slice尾部追加元素
可以将一个slice追加在另一个slice尾部
如果最终未超过追加到slice的容量则返回原始slice//内存地址没有改变
如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据//重新分配内存地址
package main
import "fmt"
func main(){
s1 :=make([]int,3,6)
fmt.Println("%v %p\n",s1,s1)
s1=append(s1,1,2)
fmt.Println("%v %p\n",s1,s1)
}
Copy
package main
import "fmt"
func main(){
s1 :=[]int{1,2,3,4,5,6,7}
s2 :=[]int{7,8,9}
copy(s1,s2) //s2的内容拷贝到s1中去,短的数组拷贝到长的数组,改变长的几个
fmt.Println(s1)
}
package main
import "fmt"
func main(){
s1 :=[]int{1,2,3,4,5,6,7}
s2 :=[]int{7,8,9}
copy(s2,s1) //长的数组拷贝到短的数组中去,只会匹配短的个数长度
fmt.Println(s2)
}
package main
import "fmt"
func main(){
s1 :=[]int{1,2,3,4,5,6,7}
s2 :=[]int{7,8,9}
copy(s2[2:2],s1[1:3])//拷贝到s2的指定并覆盖原有的数据
fmt.Println(s2)
}
package main
import "fmt"
func main(){
s1 :=[]int{1,2,3,4,5,6,7,1,1,1}
s2 :=[]int{7,8,9,11,22,33,44,55,66,77,88}
copy(s2[10:],s1[1:3])//拷贝到s2的指定并覆盖原有的数据.若复制的值超过被复制的数组,只会留下部分复制的数据,s1的值只会在s2留下一个
fmt.Println(s2)
fmt.Println(s1[1:3])
}
##遍历、修改切片
package main
import "fmt"
func main() {
slice0 := []string{"a", "b", "c", "d", "e", "f"}
fmt.Printf("\n*****元素遍历*****")
for _, value := range slice0 {
fmt.Println(value, " ")
}
fmt.Println("\n*****索引遍历******")
for index := range slice0 {
fmt.Println(index, slice0[index])
}
fmt.Println("\n******元素索引共同使用******")
for index, value := range slice0 {
fmt.Println(value, slice0[index])
}
fmt.Println("\n******修改******")
for index := range slice0 {
slice0[index] = "9"
}
fmt.Println(slice0)
}
###注意:使用 “_” 则表示忽略,因为go语言中,未使用的值会导致编译错误,只有一个元素时,该元素代表索引,在元素遍历中,是不能直接修改,主要是因为值传递,为该切片元素的副本,修改它不会影响原本值,只有修改的是该切片的元素引用的值,才可以修改