切片append()方法

声明一个切片

package main

import "fmt"

func main() {
  s1 := []string{"天津", "北京", "上海"}
  fmt.Printf("s1:=%v,len(%d),cap(%d)", s1, len(s1), cap(s1))
}

使用append方法为切片添加元素

package main

import "fmt"

func main() {
  s1 := []string{"天津", "北京", "上海"}
  fmt.Printf("s1=%v,len(%d),cap(%d)\n", s1, len(s1), cap(s1))
  s1 = append(s1, "深圳")
  fmt.Printf("s1=%v,len(%d),cap(%d)\n", s1, len(s1), cap(s1))
}

append实际就是再生成一个切片来代替原来的切片,就跟一家公司扩展时需要换地方一样只是更换的地方但是在外人眼里还是那家公司

append方法扩容切片容量变化

  • 首先判断,如果新申请容量(cap)大于2倍旧的容量(old.cap),最终容量(newcap)就是新申请的容量(cap)
  • 否则判断,如果旧的切片长度小于1024,则最终容量(newcap)就是旧容量(old.cap)的两倍,即(newcap=doublecap)
  • 否则判断,如果旧切片长度大于等于1024,则最终容量(newcap)从旧容量(old.cap)开始循环增加原来的1/4,即(newcap=old.cap,for{newcap+=newcap/4})直到最终容量(newcap)大于登录新申请的容量(cap),即(newcap> =cap)
  • 如果最终容量(cap)计算值溢出,则最终容量(cap)就是新申请容量(cap)

需要注意的是,切片扩容还会根据切片中元素的类型不同而作不同的处理,比如int和string类型的处理方式就不一样

使用append方法删除元素

package main

import "fmt"

func main() {
  a1 := []int{1, 2, 3, 4, 5, 6}
  fmt.Printf("删除前a1:%d", a1)
  //删除2
  a1 = append(a1[:1], a1[2:]...) //a1[:1]就是a1 = {1},a1[2:]就是 a1 = {3,4,5,6} 然后append再将两个数组进行缝合,利用了左闭右开的原理
  fmt.Printf("删除后a1:%d", a1)
}

append是修改底层数据来实现数据的添加和删除,切片只能圈主一块连续的内存地址,切片不保存数值,底层数组才保存数组

append小练习

package main

import "fmt"

func main() {
  a1 := make([]int, 5, 10)
  for i := 0; i < 10; i++ {
    a1 = append(a1, i)
  }
  fmt.Printf("a1值为:%d", a1) //a1值为:[0 0 0 0 0 0 1 2 3 4 5 6 7 8 9]
}

因为make声明的切片长度为6(0-5),其底层数组默认就有6个0,append又是扩容所以后面i都是扩容进切片的底层数组中

posted @   suknna  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示