一、什么是切片

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基础之切片的更多相关文章

  1. Go语言基础之切片

    Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...

  2. GoLang基础数据类型-切片(slice)详解

    GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...

  3. GO学习-(9) Go语言基础之切片

    Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...

  4. golang基础---Slice切片

    切片Slice在go语言中是单独的类型(指向底层的数组),不同于python(对可迭代对象操作的工具),注意区分数组和slice的区别 定义一个空slice,格式var s []int,这种既没有长度 ...

  5. Python基础3切片,字符串的方法

    切片:截取字符串某一段字符,并不改变原字符串.结构:[起始位置:终止位置:步长]  但不包括终止位置.所谓:顾头不顾尾 索引:序列中每个元素都是有编号的,都是从0开始编号的.使用负数索引时,Pytho ...

  6. Python基础(切片,list循环,元组)

    list和字符串循环: 切片:list取值的一种方式,同样适用于字符串(因为字符串也有下标) 不可变类型:元组,字符串

  7. Python基础3切片,字符串的方法,for 循环

    切片:截取序列(字符串,列表,元组等)中某一段字符,并不改变原数据和数据类型.结构:[起始位置:终止位置:步长]  但不包括终止位置.所谓:顾头不顾尾. 索引:序列中每个元素都是有编号的,都是从0开始 ...

  8. go语言基础之切片做函数参数

    1.切片做函数参数 (备注:用了冒泡排序) 示例: package main //必须有个main包 import "fmt" import "math/rand&quo ...

  9. go语言基础之切片和底层数组关系

    1.切片和底层数组关系 示例: package main //必须有个main包 import "fmt" func main() { a := []int{0, 1, 2, 3, ...

  10. go语言基础之切片的创建和截取

    1.切片的创建 示例: package main //必须有个main包 import "fmt" func main() { //切片和数组的区别 //数组[]里面的长度时固定的 ...

随机推荐

  1. ArcGIS JS 4加载第三方矢量切片

        现在矢量切片越来越普及,对于地图渲染能更轻更快.ArcGIS JS 4.13可以实现加载第三方矢量切片,以下为代码示例,最下方是我之前切的建筑物数据.     当切片大小在1M左右,加载效果还 ...

  2. Android 共享参数 SharedPreferences

    完成共享参数的读写 public class SharedPreference { private Context context; public SharedPreference(Context c ...

  3. Python—Celery 框架使用

    一.Celery 核心模块 1. Brokers brokers 中文意思为中间人,在这里就是指任务队列本身,接收生产者发来的消息即Task,将任务存入队列.任务的消费者是Worker,Brokers ...

  4. centos7网口添加IP,修改默认路由永久地址生效

    1永久增加ip地址和路由 网卡永久添加ip地址 注释:ens192为管理地址网卡,请根据实际情况进行修改,网关以192.168.160.1为例 复制一份网卡配置文件命名为ifcfg-ens192:1 ...

  5. C++双指针滑动和利用Vector实现无重复字符的最长子串—力扣算法

    题目: 力扣原题链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 给定一个字符串, ...

  6. Cocos Creator | 炮弹发射效果模拟

    一.预览效果 ​ 二.设置物理世界属性: 1.打开物理系统: cc.director.getPhysicsManager().enabled = true; 2. 配置重力加速度: cc.direct ...

  7. Python中通过csv的writerow输出的内容有多余的空行两种方法

    第一种方法 如下生成的csv文件会有多个空行 import csv #python2可以用file替代open with open("test.csv","w" ...

  8. 设置Redis的LRU策略

    概念 LRU(Least Recently Used)最近最少使用算法是众多置换算法中的一种. maxmemory Redis中有一个maxmemory概念,主要是为了将使用的内存限定在一个固定的大小 ...

  9. 剑指offer笔记面试题7----重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列 ...

  10. angular cli 使用echarts

    1.安装库 npm install typings echarts --global npm install ngx-echarts --save npm install @types/echarts ...