切片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都是扩容进切片的底层数组中
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通