GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素
2024-08-31 12:35:49
append()方法为切片添加元素
注意:通过var声明的零值切片可以在append()函数直接使用,无需初始化。
var s []int
s = append(s, 1, 2, 3)
- append()函数将元素追加到切片的最后并返回该切片。
- 切片numSlice的容量按照1,2,4,8,16这样的规则自动进行扩容,每次扩容后都是扩容前的2倍。
切片的扩容策略
查看$GOROOT/src/runtime/slice.go源码
package main
import "fmt"
// append() 为切片追加元素
func main(){
s1 := []string{"北京", "上海", "深圳"}
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
// s1[3] = "广州" // 错误的写法 会导致编译错误:索引越界
// fmt.Println(s1) // index out of range [3] with length 3
// 调用append函数必须用原来的切片变量接收返回值
// append追加元素 原来的底层数组放不下的时候 Go语言就会把底层数组换一个
// 必须用变量接收append的返回值
fmt.Println(s1)
s1 = append(s1, "广州")
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
s1 = append(s1, "杭州", "成都")
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
ss := []string{"武汉", "西安", "苏州"}
s1 = append(s1, ss...) // ...表示拆开
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
}
使用copy()函数复制切片
copy()函数的格式:
copy(destSlice, srcSlice []T)
其中:
- srcSlice: 数据来源切片
- destSlice: 目标切片
从切片中删除元素
package main
import "fmt"
// 关于append删除切片中的某个元素
func main(){
a1 := [...]int{1,3,5,7,9,11,13,15,17}
s1 := a1[:]
// 删除索引为1的那个3
s1 = append(s1[0:1], s1[2:]...)
fmt.Println(s1) // [1 5 7 9 11 13 15 17]
fmt.Println(a1) // [1 5 7 9 11 13 15 17 17]
}
切片不存值 底层数组存值
package main
import "fmt"
// copy
func main() {
a1 := []int{1,3,5}
a2 := a1 // 赋值
// var a3 []int // nil
var a3 = make([]int, 3, 3)
copy(a3, a1) // copy
fmt.Println(a1, a2, a3)
a1[0] = 100
fmt.Println(a1, a2, a3)
// 将a1中的索引为1的3这个元素删除
a1 = append(a1[:1], a1[2:]...)
fmt.Println(a1)
fmt.Println(cap(a1))
x1 := [...]int{1, 3, 5} // 数组
s1 := x1[:]
fmt.Println(s1, len(s1), cap(s1))
// 1. 切片不保存具体的值
// 2. 切片对应一个底层数组
// 3. 底层数组都是占用一块连续的内存
fmt.Printf("%p\n", &s1[0])
s1 = append(s1[:1], s1[2:]...) // 修改了底层数组!
fmt.Printf("%p\n", &s1[0])
fmt.Println(s1, len(s1), cap(s1))
// ?
// s1[0] = 100 // 修改底层数组
fmt.Println(x1) // [1 5 5]
}
练习题
package main
import (
"fmt"
"sort"
)
// 切片的练习题
func main() {
var a = make([]int, 5, 10) // 创建切片 长度为5 容量为10
fmt.Println(a) // [0 0 0 0 0]
for i := 0; i < 10; i++ {
a = append(a, i)
}
fmt.Println(a) // [0 0 0 0 0 0 1 2 3 4 5 6 7 8 9]
fmt.Println(cap(a))
// sort排序
var a1 = [...]int{3, 7, 8, 9, 1}
sort.Ints(a1[:]) // 对切片进行排序
fmt.Println(a1)
}
最新文章
- SQL Server索引视图以(物化视图)及索引视图与查询重写
- 文件与目录的rwx权限
- javascrit2.0完全参考手册(第二版) 第2章第4节 基本的数据类型
- java5 CountDownLatch同步工具
- nova分析(7)—— nova-scheduler
- 全局变量&;局部变量
- std::sort引发的core
- HW—字符串最后一个单词的长度,单词以空格隔开。
- 10 款强大的JavaScript图表图形插件推荐
- 0118——UIButtton
- 2015第9周三html5学习0
- JS - 实现简单易用的倒计时 x 天 x 时 x 分 x 秒
- SAP问题【转载】
- [SCOI2015]小凸玩矩阵
- maven使用utf8等
- weex用阿里矢量图
- Ambari2.7.3 和HDP3.1.0搭建Hadoop集群
- js格式化日期工具类
- 【LeetCode】数组移除元素
- gearman 简单试用
热门文章
- spring-boot-learning-Web开发-深入理解springMVC
- git-learningmeiy
- 两个链表有一个交点,如何在时间复杂度 O(n) 和 空间复杂度 O(1) 的条件下实现?_字节跳动面试题
- 有没有可能两个不相等的对象有有相同的 hashcode?
- 树莓派系统安装(ubuntu版本)无需屏幕
- 如何保证同事的代码不会腐烂?一文带你了解 阿里巴巴 COLA 架构
- Mybatis 实现批量插入和批量删除源码实例
- 机器学习---kmeans聚类的python实现
- 8.Jenkins进阶之流水线pipeline基础使用实践(1)
- Java学习day9