GO基础之切片
一、什么是切片
Go语言切片是对数组的抽象。
- Go数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组");
 - 与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
 - 切片本身没有任何数据,它们只是对现有数组的引用。
 - 切片与数组相比,不需要设定长度,在[ ]中不用设定值,相对来说比较自由
 - 从概念上面来说slice像一个结构体,这个结构体包含了三个元素:
 
切片的结构:
- 〇指针,指向数组中slice指定的开始位置
 - 〇长度,SPslice的长度
 - 〇最大长度,也就是slice开始位置到数组的最后位置的长度
 
二、切片的使用
切片的声明

s1 := make([]int, )
s2 := make([]int, , )
切片的初始化:

nums := []int{, , , , }
len()和cap()函数
1、 切片的长度是切片中元素的数量。
2、 切片的容量是从创建切片的索引开始的底层数组中元素的数量。
3、 切片是可索引的,并且可以由len()方法获取长度,切片提供了计算容量的方 法cap(),可以测量切片最长可以达到多少。[数组计算cap()结果与len()相同]
4、 切片实际的是获取数组的某一部分,len切片<=cap切片<=len数组
package main
import "fmt"
func main() {
    s1 := make([]int, )
    s2 := make([]int, , )
    printSlice(s1) //length:5,cap=5,slice=[0 0 0 0 0]
    printSlice(s2) //length:5,cap=7,slice=[0 0 0 0 0]
    //创建切片
    nums := []int{, , , , }
    printSlice(nums)
    //从切片中截取小切片
    nums1 := nums[:]
    printSlice(nums1) //length:3,cap=4,slice=[2 3 4]
    nums2 := nums[:]
    printSlice(nums2) //length:3,cap=5,slice=[1 2 3]
    nums3 := nums[:]
    printSlice(nums3) //length:3,cap=3,slice=[3 4 5]
}
func printSlice(slc []int) {
    fmt.Printf("length:%d,cap=%d,slice=%v \n", len(slc), cap(slc), slc)
}
三、切片的常用函数
(五)、append( ) 和 copy( )函数
1、函数append( ):
- •往切片中追加新元素
 - •可以向 slice里面追加一个或者多个元素,也可以追加一个切片。
 - • append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的 其它slice。
 - •当使用 append追加元素到切片时,如果容量不够(也就是(cap-len)== 0),Go就会创建一个新的内存地址来储存元素(该方式效率较低)。
 
2、函数copy:*复制切片元素
- •将源切片中的元素复制到目标切片中,返回复制的元素的个数
 - • copy方法是不会建立源切片与目标切片之间的联系。也就是两个切片不存 在联系,一个修改不影响另一个。
 
package main
import "fmt"
func main() {
    //创建切片
    nums := []int{, , , , }
    printSlice("nums", nums) //slice=nums,p=0xc00000c5d0,length:5,cap=5,slice=[1 2 3 4 5]
    //append 追加元素
    nums = append(nums, )
    printSlice("nums", nums) //slice=nums,p=0xc000014230,length:6,cap=10,slice=[1 2 3 4 5 10]
    a := []int{, , , }
    //追加数组
    nums = append(nums, a...)
    printSlice("nums", nums) //slice=nums,p=0xc000014230,length:10,cap=10,slice=[1 2 3 4 5 10 6 7 8 9]
    //删除第一个元素
    nums = nums[:]
    printSlice("nums", nums) //slice=nums,p=0xc000014238,length:9,cap=9,slice=[2 3 4 5 10 6 7 8 9]
    //删除最后一个元素
    nums = nums[:len(nums)-]
    printSlice("nums", nums) //slice=nums,p=0xc000014238,length:8,cap=9,slice=[2 3 4 5 10 6 7 8]
    //删除中间的元素
    b := int(len(nums) / )
    nums = append(nums[:b], nums[b+:]...)
    printSlice("nums", nums) //slice=nums,p=0xc000014238,length:7,cap=9,slice=[2 3 4 5 6 7 8]
    //切片copy
    nums2 := make([]int, len(nums), cap(nums)*)
    //copy 的切片没有关联
    copy(nums2, nums)
    printSlice("nums2", nums2) //slice=nums,p=0xc000014238,length:7,cap=9,slice=[2 3 4 5 6 7 8]
}
func printSlice(name string, slc []int) {
    fmt.Printf("slice=%v,p=%p,length:%d,cap=%d,slice=%v \n", name, slc, len(slc), cap(slc), slc)
}
3、使用make创建切片
package main import "fmt"
import "strconv" func main() {
str := make([]string, , )
printSlice("str", str)
for i := ; i < ; i++ {
str = append(str, strconv.Itoa(i))
}
printSlice("str", str) }
func printSlice(name string, slc []string) {
fmt.Printf("slice=%v,p=%p,length:%d,cap=%d,slice=%v \n", name, slc, len(slc), cap(slc), slc)
}
GO基础之切片的更多相关文章
- Go语言基础之切片
		
Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...
 - GoLang基础数据类型-切片(slice)详解
		
GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...
 - GO学习-(9) Go语言基础之切片
		
Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...
 - golang基础---Slice切片
		
切片Slice在go语言中是单独的类型(指向底层的数组),不同于python(对可迭代对象操作的工具),注意区分数组和slice的区别 定义一个空slice,格式var s []int,这种既没有长度 ...
 - Python基础3切片,字符串的方法
		
切片:截取字符串某一段字符,并不改变原字符串.结构:[起始位置:终止位置:步长] 但不包括终止位置.所谓:顾头不顾尾 索引:序列中每个元素都是有编号的,都是从0开始编号的.使用负数索引时,Pytho ...
 - Python基础(切片,list循环,元组)
		
list和字符串循环: 切片:list取值的一种方式,同样适用于字符串(因为字符串也有下标) 不可变类型:元组,字符串
 - Python基础3切片,字符串的方法,for 循环
		
切片:截取序列(字符串,列表,元组等)中某一段字符,并不改变原数据和数据类型.结构:[起始位置:终止位置:步长] 但不包括终止位置.所谓:顾头不顾尾. 索引:序列中每个元素都是有编号的,都是从0开始 ...
 - go语言基础之切片做函数参数
		
1.切片做函数参数 (备注:用了冒泡排序) 示例: package main //必须有个main包 import "fmt" import "math/rand&quo ...
 - go语言基础之切片和底层数组关系
		
1.切片和底层数组关系 示例: package main //必须有个main包 import "fmt" func main() { a := []int{0, 1, 2, 3, ...
 - go语言基础之切片的创建和截取
		
1.切片的创建 示例: package main //必须有个main包 import "fmt" func main() { //切片和数组的区别 //数组[]里面的长度时固定的 ...
 
随机推荐
- sudo 1.2.27 - Security Bypass
			
EXP: https://www.exploit-db.com/exploits/47502?utm_source=dlvr.it&utm_medium=twitter 漏洞复现: 具体配置参 ...
 - spring boot 2 + shiro 实现简单的身份验证例子
			
Shiro是一个功能强大且易于使用的Java安全框架,官网:https://shiro.apache.org/. 主要功能有身份验证.授权.加密和会话管理.其它特性有Web支持.缓存.测试支持.允许一 ...
 - 浅谈Mysql重置密码
			
新手刚开始用MySQL的时候可能会很容易忘记登录密码,下面说一下如何重置和修改密码 第一种方法:直接在命令行窗口操作停止服务器mysql(这是重点:直接停止)打开CMD 在命令行窗口输入MySQL安装 ...
 - 如何将本地的项目推送到github
			
一.创建密钥 1.本地终端命令行生成密钥 访问密钥创建的帮助文档:https://help.github.com/en/github/authenticating-to-github/generati ...
 - VO(视图模型) 与 DTO(数据传输对象)的区别
			
目录 VO(视图模型) 与 DTO(数据传输对象)的区别 1.VO与DTO概念 2.VO 视图模型的必要性与解耦 2.1 视图模型 2.2 视图模型存在的必要性 2.3 视图模型的解耦 3.DTO 存 ...
 - Prism_Composite Commands(3)
			
Composite Commands 在许多情况下,视图模型定义的命令将绑定到关联视图中的控件,以便用户可以直接从视图中调用该命令.但是,在某些情况下,您可能希望能够从应用程序UI的父视图中的控件调用 ...
 - Git实战指南----跟着haibiscuit学Git(第六篇)
			
笔名: haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...
 - UML简单介绍—类图这么看就懂了
			
如何看懂类图 1.类图简介 描述类的内部结构和类与类之间的关系,是一种静态结构图. 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关 ...
 - 43.QT-访问远程SQLite数据库
			
在上章42.QT-QSqlQuery类操作SQLite数据库(创建.查询.删除.修改)详解学习了如何操作SQLite,本章来学习如何访问远程SQLite 1.首先设置共享,映射(用来实现远程访问) 将 ...
 - Python语法速查: 7. 函数基础
			
返回目录 (1)函数基本 ● 函数是第一类对象 Python中万物皆对象,所有对象都是第一类的(first class),函数也不例外,也是第一类对象.既然是对象,那就可以当作普通的对象数据处理,比如 ...