7、go切片(Slice)

go切片(Slice)

Slice使用的几种方式

arr := [...]int{0,1,2,3,4,5,6,7}
fmt.Println( "arr[2:6] = ", arr[2:6]) //arr[2:6] =  [2 3 4 5]
fmt.Println( "arr[:6] = ", arr[:6]) //arr[:6] = [0 1 2 3 4 5]
fmt.Println( "arr[2:] = ", arr[2:]) //arr[2:] = [2 3 4 5 6 7]
fmt.Println( "arr[:] = ", arr[:]) //arr[:] = [0 1 2 3 4 5 6 7]

注意

Slice本身没有数据,是对底层array的一个view
下方s[0]对应的是arr[2]

arr := [...]int{0,1,2,3,4,5,6,7}
s := arr[2:6]
s[0] = 10
fmt.Println(arr) //[0 1 10 3 4 5 6 7]

slice上建立slice

arr := [...]int{0,1,2,3,4,5,6,7}
s := arr[2:6] //[2 3 4 5]
s = s[:5] //[2 3 4 5 6]
s = s[2:] //[4 5 6]

slice可以向后扩展,不可以向前扩展
向后扩展不可以超越底层数组cap(s)
直接访问slice不可以超过切片长度

arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6] // [2 3 4 5]
s2 := s1[3:5] // [5 6]

cap

在这里插入图片描述

arr := [8]int{0,1,2,3,4,5,6,7}
fmt.Println("arr = ",arr)
s1 := arr[2:6] // [2 3 4 5]
s2 := s1[3:5] //  [5 6]
fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d\n", s1, len(s1), cap(s1))
fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d", s2, len(s2), cap(s2))

上方例子输出结果如下
在这里插入图片描述

slice添加值

使用append往切片中添加值
添加元素时如果超过cap,系统会重新分配更大的底层数组
由于值传递的关系,必须接收append的返回值

arr := [8]int{0,1,2,3,4,5,6,7}
s := arr[2:6] // s = [2 3 4 5]
s1 := append(s, 4) // s1 = [2 3 4 5 4] arr = [0 1 2 3 4 5 4 7]
s2 := append(s1, 5)// s2 = [2 3 4 5 4 5] arr = [0 1 2 3 4 5 4 5]
//下面这行执行完后s3 view的数组不是arr
//因为长度已经超过了arr的长度,所以go会重新将arr复制一份,用于s3
s3 := append(s2, 6)// s3 = [2 3 4 5 4 5 6] arr = [0 1 2 3 4 5 4 5]
fmt.Println("s, s1, s2, s3",s,s1,s2,s3)

定义slice

var s []int
// s == nil
for i := 0; i < 100; i++ {
	s = append( s, i)
}
fmt.Println( s) // [0 1 2 ......99]

创建切片

slice1 := make([]int, 10)
slice2 := make([]int, 10, 32)
fmt.Printf("slice1: value:%v, len:%d, cap:%d\n",slice1, len(slice1), cap(slice1))
fmt.Printf("slice2: value:%v, len:%d, cap:%d\n",slice2, len(slice2), cap(slice2))

结果如下:
在这里插入图片描述

copy slice

package main
import "fmt"
func main() {
	var numbers []int
	numbers = append(numbers,0,1,2,3,4)
	printSlice(numbers)

	numbers1 := make([]int, len(numbers), (cap(numbers)) * 2)
	printSlice(numbers1)

	copy(numbers1,numbers)
	printSlice(numbers1)
}
func printSlice(x []int){
	fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

在这里插入图片描述

删除slice

func main() {
	numbers := []int{0,1,2,3,4,5,6,7,8}
	printSlice2(numbers)
	//删除中间的元素5
	numbers = append(numbers[:5], numbers[6:]...)//[0 1 2 3 4 6 7 8]
	printSlice2(numbers)
	//删除头部元素
	numbers = numbers[1:];//[1 2 3 4 6 7 8]
	printSlice2(numbers)
	//删除尾部元素
	numbers = numbers[:len(numbers)-1]//[ 1 2 3 4 6 7]
	printSlice2(numbers)
}
func printSlice2(x []int){
	fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值