GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素
2022/4/30 23:23:32
本文主要是介绍GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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) }
这篇关于GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24MongoDB资料:新手入门完全指南
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享