go slice

切片

slice 扩展

slice只能向后扩展!!!

package main

import "fmt"

func main() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8}
	s1 := arr[2:6] // len -> [2 3 4 5] cap->[2, 3, 4, 5, 6, 7, 8]
	s2 := s1[3:6]  // len -> [5 6 7] cap->[5, 6, 7, 8]
	s3 := s2[0:4]  // len -> [5 6 7 8] cap->[5, 6, 7, 8]

	// s1 取arr的[2:6] 为 [2 3 4 5] 正常的
	fmt.Println("s1=", s1, "len(s1)=", len(s1), "cap(s1)=", cap(s1)) // s1= [2 3 4 5] len(s1)= 4 cap(s1)= 7
	// s2 能取到s1的[5 6 7] 是因为s1的容量为7 相当于s1为[2, 3, 4, 5, 6, 7, 8],正常情况s1只能取 [2 3 4 5] ,
	// 但是因为slice扩展的特性,所以可以取超过 [2 3 4 5] 之后的值,但是不能超过最大容量,也就是[2, 3, 4, 5, 6, 7, 8]之外
	// 下面s2 s3 同理。
	fmt.Println("s2=", s2, "len(s2)=", len(s2), "cap(s2)=", cap(s2)) // s2= [5 6 7] len(s2)= 3 cap(s2)= 4
	fmt.Println("s3=", s3, "len(s3)=", len(s3), "cap(s3)=", cap(s3)) // s3= [5 6 7 8] len(s3)= 4 cap(s3)= 4
}

slice只能向后扩展

slice 下标一旦从前往后取,就无法再向前,容量会越来越少,可越界的也会变少!!!!!!!!

package main

import "fmt"

func main() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8}
	s1 := arr[2:4]
	s2 := s1[0:1]
	s3 := s2[0:1]
	s4 := s3[2:4]
	fmt.Println("s1=", s1, "len(s1)=", len(s1), "cap(s1)=", cap(s1)) // s1= [2 3] len(s1)= 2 cap(s1)= 7
	fmt.Println("s2=", s2, "len(s2)=", len(s2), "cap(s2)=", cap(s2)) // s2= [0] len(s2)= 1 cap(s2)= 9
	fmt.Println("s3=", s3, "len(s3)=", len(s3), "cap(s3)=", cap(s3)) // s3= [2] len(s3)= 1 cap(s3)= 7
	fmt.Println("s4=", s4, "len(s4)=", len(s4), "cap(s4)=", cap(s4)) // s4= [4 5] len(s4)= 2 cap(s4)= 5
}

切片的增删改查

demo1

package main

import "fmt"

// copy
func copyFunc() {
	// 不copy ,直接赋值 s1 = s2 ,这样改了一个,另一个切片也会改变
	var s1 = []int{1, 2, 3, 4}
	var s2 = make([]int, len(s1))
	copy(s2, s1)
	s2[0] = 100
	fmt.Println(s1)
	fmt.Println(s2)
}

// query
func query() {
	var s1 = []int{1, 2, 3, 4}
	var key = 2
	for i, v := range s1 {
		if v == key {
			fmt.Println("key的下标为", i)
		}
	}
}

// update
func update() {
	var s1 = []int{1, 2, 3, 4}
	s1[1] = 100
	fmt.Println(s1)
}

// del
func del() {
	var s1 = []int{1, 2, 3, 4}
	// 相当于覆盖,从哪个位置覆盖哪些内容
	s1 = append(s1[:2], s1[3:]...)
	fmt.Println(s1)
}

// add
func add() {
	var s1 []int
	s1 = append(s1, 1, 2, 3)
	fmt.Println(s1)
}
func main() {
	copyFunc()
}

demo2

package main

import "fmt"

func main() {
	s1 := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}

	//s9 := []int{9}
	// 增加
	//s2 := append(s1, s9...)
	//fmt.Println(s2)

	// 截取
	// 取第一个
	first := s1[0]
	fmt.Println(first)
	// 取最后一个
	last := s1[len(s1)-1]
	fmt.Println(last)

	// 删除
	// 删除第一个
	delfirst := s1[1:]
	fmt.Println(delfirst)
	// 删除最后一个
	dellast := s1[:len(s1)-1]
	fmt.Println(dellast)

	// 更改
	s1[2] = 9
	fmt.Println(s1)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值