一、什么是切片

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. WinForm WebBrowser 设置cookie

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] public static exte ...

  2. asp.net core 3.0 MVC JSON 全局配置

    asp.net core 3.0 MVC JSON 全局配置 System.Text.Json(default) startup配置代码如下: using System.Text.Encodings. ...

  3. CefSharp禁止弹出新窗体,在同一窗口打开链接,或者在新Tab页打开链接,并且支持带type="POST" target="_blank"的链接

    说明:在同一窗口打开链接,只要稍加改造就可以实现,这里实现的是在新Tab页打开链接,并且支持带type="POST" target="_blank"的链接 gi ...

  4. 爬虫(五):代理IP、Cookie

    1. 代理IP 代理IP这个功能呢,在urllib和requests中都存在,但是这个在大的爬虫项目中是非常重要的,所以我拿出来单独讲解. 对于某些网站,如果同一个 IP 短时间内发送大量请求,则可能 ...

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

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

  6. Java题库——Chapter14 JavaFX基础

    Chapter 14 JavaFX Basics Section 14.2 JavaFX vs Swing and AWT1. Why is JavaFX preferred?a. JavaFX is ...

  7. 收藏收藏:工作用了很久的自主开发的Sql Server代码生成器,我开源了(.NET Winform)

    大家好,已经一年没见了,我的技术已经有了惊人的进步.于是乎就来为大家分享技术了,今天呢为大家带来的是很早之前开发的老工具分享给大家. 相信大家都使用过代码生成器,用起来顺手的有多少?根据自己的业务配置 ...

  8. Ocelot网关在.Net Core 的使用

    1.  项目环境 .Net Core 2.2      Ocelot 13.5.2 2. 基本使用 * Nuget 安装 Ocelot , Ocelot.Provider.Polly * 修改 Pro ...

  9. ELK日志分析系统(2)-logspout收集容器日志

    1. 概述 安装了ELK之后,就是要考虑怎么获取log数据了. 收集log数据的方式有很多种: 1). beats采集数据发布到logstash 2). Filebeat采集数据发布到logstash ...

  10. html中的a标签详解

    事故起源于一个魔鬼测试人员,某天做网站UI优化的时候,突然甩了一个问题给我 第二列的数据是可以跳转至其他页面的,但是,魔鬼测试的电脑上,一直都有一条数据是与其他的样式不同,于是便甩了这个问题给我,我一 ...