本文介绍: 1. 声明切片2. 初始化切片2.1 切片长度2.1.1 初始化指定长度的切片2.1.2 查看切片长度 len()2.2 切片容量2.2.1 初始化指定容量的切片2.2.2 查看切片长度 len()3 切片赋值3.1 直接赋值3.2 引用数组给切片赋值3.3 引用数组某区间给切片赋值3.4 通过切片赋值给切片4. 空切片5. append()6. copy()
1. 声明切片
var SliceName []type
var names []string
2. 初始化切片
2.1 切片长度
2.1.1 初始化指定长度的切片
var slice1 = make([]type, len)
在函数内,可简写做:
slice1 := make([]type, len)
- 语法示例
var names = make([]string,3)
names := make([]string,3)
var names []string
names = make([]string,3)
2.1.2 查看切片长度 len()
- 语法
len(SliceName)
package main
import "fmt"
func main() {
names := make([]string,10)
fmt.Printf("切片:%+vn长度为:%d",names,len(names))
}
切片:[ ]
长度为:10
- 说明:
问:明明打印的切片没有成员,为什么长度为10?
答:可以看见我们打印出的结果是[ ]
而不是[]
。这里边有9个空格,即是10个成员间的9个分隔符(空格)。我们看不到成员,是因为这10个成员的值默认都是空(字串不赋值默认为空)。如果我们定义切片成员类型是int
我们将看到打印出10个0
(int类型不赋值,默认为0)
package main
import "fmt"
func main() {
slice1 := make([]int,10)
fmt.Printf("切片:%+vn长度为:%d",slice1,len(slice1))
}
结果:
切片:[0 0 0 0 0 0 0 0 0 0]
长度为:10
2.2 切片容量
2.2.1 初始化指定容量的切片
说明:
- 语法
slice1 := make([]type, len, cap)
- 语法示例
names := make([]string,3,5)
2.2.2 查看切片长度 len()
- 语法
cap(SliceName)
package main
import "fmt"
func main() {
names := make([]string,3,5)
fmt.Printf("切片长度为:%d,容量为:%d",len(names),cap(names))
}
切片长度为:3,容量为:5
3 切片赋值
3.1 直接赋值
- 语法示例
names :=[]string{"刘备","关羽","张飞" }
- 完整示例
package main
import "fmt"
func main() {
names := []string{"刘备","关羽","张飞"}
fmt.Printf("打印切片:%+vn长度为:%dn容量为:%d",names,len(names),cap(names))
}
打印切片:[刘备 关羽 张飞]
长度为:3
容量为:3
3.2 引用数组给切片赋值
- 语法
s := arr[:]
package main
import "fmt"
func main() {
namesArray := [3]string{"刘备","关羽","张飞"} //定义一个数组
names := namesArray[:] //声明切片并用数组给切片赋值
fmt.Printf("打印切片:%+vn长度为:%dn容量为:%d",names,len(names),cap(names))
}
打印切片:[刘备 关羽 张飞]
长度为:3
容量为:3
3.3 引用数组某区间给切片赋值
前提:设
N
为起始位置,到第M
个成员。
3.3.1 从数组位置N个取到第M个元素,赋值给切片
– 语法
s := arr[N:M]
– 示例
package main
import "fmt"
func main() {
namesArray := [5]string{"刘备","关羽","张飞","赵云","诸葛亮"} //定义一个数组
names := namesArray[1:3]
fmt.Printf("打印切片:%+vn长度为:%dn容量为:%d",names,len(names),cap(names))
}
- 结果打印
打印切片:[关羽 张飞]
长度为:2
容量为:4
长度是2,因为我们取到了两个成员:关羽、张飞
容量是4,这是从起始位置1(关羽)起,计算到数组结尾(诸葛亮),一共四个位置。
虽然没有取到赵云和诸葛亮,但是容量已经加进来了
3.3.2 从数组位置N取到结尾,赋值给切片
– 语法
s := arr[N:]
– 示例
package main
import "fmt"
func main() {
namesArray := [5]string{"刘备","关羽","张飞","赵云","诸葛亮"} //定义一个数组
names := namesArray[1:]
fmt.Printf("打印切片:%+vn长度为:%dn容量为:%d",names,len(names),cap(names))
}
打印切片:[关羽 张飞 赵云 诸葛亮]
长度为:4
容量为:4
3.3.3 从开头取到第M个元素,赋值给切片
– 语法
s := arr[:M]
– 示例
package main
import "fmt"
func main() {
namesArray := [5]string{"刘备","关羽","张飞","赵云","诸葛亮"} //定义一个数组
names := namesArray[:3]
fmt.Printf("打印切片:%+vn长度为:%dn容量为:%d",names,len(names),cap(names))
}
结果打印
打印切片:[刘备 关羽 张飞]
长度为:3
容量为:5
- 说明
长度是3,因为我们取到了3个成员:刘备、关羽、张飞
容量是5,这是从起始位置0(刘备)起,计算到数组结尾(诸葛亮),一共四个位置。
3.4 通过切片赋值给切片
说明:通过切片s初始化切片s1
s2 := s1[N:M]
方法同数组赋值给切片
4. 空切片
4.1 仅声明的切片为空
package main
import "fmt"
func main() {
var names []string
fmt.Printf("打印切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
if names == nil {
fmt.Printf("切片是空的")
}else {
fmt.Println("切片不为空")
}
}
- 结果
打印切片:[]
长度为:0
容量为:0
切片是空的
4.2 初始容量为0的切片不为空
package main
import "fmt"
func main() {
var names = make([]string,0,0)
fmt.Printf("打印切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
if names == nil {
fmt.Println("切片是空的")
}else {
fmt.Println("切片不为空")
}
}
结果打印
打印切片:[]
长度为:0
容量为:0
切片不为空
5. append()
– 语法
- 语法
func append(slice []Type, elems ...Type) []Type
- 语法示例
names = append(names,"赵云")
– 示例1(添加一个成员)
package main
import "fmt"
func main() {
names := []string{"刘备","关羽","张飞"}
fmt.Printf("原切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
names = append(names,"赵云")
fmt.Printf("==================n添加成员后:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
}
- 结果
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
添加成员后:[刘备 关羽 张飞 赵云]
长度为:4
容量为:6
- 说明:
结果可见,当成员达到容量上限后,再添加成员,长度增加一,但是容量会翻倍。
– 示例2(添加多个成员)
package main
import "fmt"
func main() {
names := []string{"刘备","关羽","张飞"}
fmt.Printf("原切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
names = append(names,"赵云")
fmt.Printf("==================n添加成员后:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
names = append(names,"马超","黄忠","魏延")
fmt.Printf("==================n添加成员后:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
}
- 结果
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
添加成员后:[刘备 关羽 张飞 赵云]
长度为:4
容量为:6
==================
添加成员后:[刘备 关羽 张飞 赵云 马超 黄忠 魏延]
长度为:7
容量为:12
- 说明
– 示例3(添加成员赋值给新切片)
package main
import "fmt"
func main() {
names := []string{"刘备","关羽","张飞"}
fmt.Printf("原切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
names2 := append(names,"赵云")
fmt.Printf("==================n新切片:%+vn长度为:%dn容量为:%dn",names2,len(names2),cap(names2))
fmt.Printf("==================n再次打印原切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
}
- 结果显示
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
新切片:[刘备 关羽 张飞 赵云]
长度为:4
容量为:6
==================
再次打印原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
- 说明:
6. copy() 函数
– 语法
func copy(dst []Type, src []Type) int
– 示例1(新切片长度 >= 原切片长度)
package main
import "fmt"
func main() {
names := []string{"刘备","关羽","张飞"}
fmt.Printf("原切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
names2 := make([]string,4,4)
num := copy(names2,names)
fmt.Printf("==================n新切片:%+vn拷贝了%d个元素n长度为:%dn容量为:%dn",names2,num,len(names2),cap(names2))
fmt.Printf("==================n再次打印原切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
}
- 结果
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
新切片:[刘备 关羽 张飞 ]
拷贝了3个元素
长度为:4
容量为:4
==================
再次打印原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
- 说明
如上可见,初始化长度为4,拷贝了3个元素,但是我们可以看到新切片最后有一个空格,是第3和第4个元素的分隔符,只是第四个元素为空
– 示例2 (新切片长度 < 原切片长度)
- 代码
package main
import "fmt"
func main() {
names := []string{"刘备","关羽","张飞"}
fmt.Printf("原切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
names2 := make([]string,2,4)
num := copy(names2,names)
fmt.Printf("==================n新切片:%+vn拷贝了%d个元素n长度为:%dn容量为:%dn",names2,num,len(names2),cap(names2))
fmt.Printf("==================n再次打印原切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
}
- 结果显示
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
新切片:[刘备 关羽]
拷贝了2个元素
长度为:2
容量为:4
==================
再次打印原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
– 示例2 (新切未初始化)
新切片未初始化的结果类似于初始化长度为0的切片
- 代码
package main
import "fmt"
func main() {
names := []string{"刘备","关羽","张飞"}
fmt.Printf("原切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
var names2 []string
if names2 == nil{
fmt.Println("==================nnames2 为空")
}else{
fmt.Println("==================nname2 不为空")
}
num := copy(names2,names)
fmt.Printf("新切片:%+vn拷贝了%d个元素n长度为:%dn容量为:%dn",names2,num,len(names2),cap(names2))
fmt.Printf("==================n再次打印原切片:%+vn长度为:%dn容量为:%dn",names,len(names),cap(names))
}
- 结果
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
names2 为空
新切片:[]
拷贝了0个元素
长度为:0
容量为:0
==================
再次打印原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
原文地址:https://blog.csdn.net/xingzuo_1840/article/details/128124805
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_15971.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。