1、切片

切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用类型的机制

切片的使用和数组类似,如遍历切片,访问切片的元素和求切片长度len(slice)都一样。

切片的长度是可以变化的,因此切片是一个可以动态变化的数组

2、切片的定义

var 切片名 []类型
比如: var a []int

  

3、切片的使用

3.1 通过引用一个已声明好的数组

func main() {
intArr := [...]int{0, 1, 2, 3, 4, 5, 6}
slice := intArr[1:6]
}

slice是一个切片

intArr[1:6]表示引用到intArr这个数组

引用intArr数组的起始下标为1,最后的下标为3(但是不包含3)

3.2 通过make来创建切片

基本语法:var 切片名 []type = make([]type,len,cap)

参数说明:type就是数据类型,len为长度,cap为容量(可选),cap不小于len

func main() {
var slice []int = make([]int, 5, 10)
// slice必须make后才能使用
slice[0] = 1
slice[4] = 9
}

通过make方式创建切片可以指定切片的大小和容量

如果没有给切片的各个元素赋值,那么就会使用默认值,

通过make方式创建的切片对应的数组,是由make底层维护,对外不可见,即只能通过slice去访问各个元素

3.3 直接指定具体数组,使用原理类似make方式

func main() {
var slice []string = []string{"jake", "tom", "marry"}
}

  

3.4 切片可以继续切片

func main() {
var slice []string = []string{"jake", "tom", "marry"}
slice2 := slice[1:3]
}

   

3.5 用append内置函数,可以对切片进行动态追加

func main() {
var slice []string = []string{"jake", "tom", "marry"}
slice = append(slice, "Lucy", "Lily")
fmt.Printf("slice追加后=%v\n", slice)
var slice2 []string = []string{"jake", "tom", "marry"}
// 可以追加切片
slice = append(slice, slice2...)
fmt.Printf("slice追加切片slice2后=%v\n", slice)
}

输出:

slice追加后=[jake tom marry Lucy Lily]
slice追加切片slice2后=[jake tom marry Lucy Lily jake tom marry]

切片append操作的原理分析:

a. go底层会创建一个新的数组newArr(安装扩容后大小)

b. 将slice原来包含的元素拷贝到新的数组newArr

c. slice重新引用到newArr

注意newArr是底层来维护的,程序员不可见。

  

3.6 使用copy内置函数来实现切片的拷贝操作

func main() {
var slice []int = []int{1, 2, 3, 4, 5}
slice2 := make([]int, 10)
copy(slice2, slice)
fmt.Printf("slice2=%v\n", slice2)
}

  

4、string和slice

string底层是一个byte数组,本身是引用这个byte数组的切片 ,因此string也可以进行切片处理

func main() {
str := "www.baidu.com"
slice := str[10:]
fmt.Printf("slice=%v\n", slice)
}

string是不可变的,也就是说不能通过str[0]='z'方式来修改字符串

如果需要修改字符串,可以先将string->[]byte或者[]rune->修改后重新转成string

切片slice的更多相关文章

  1. go 数组(array)、切片(slice)、map、结构体(struct)

    一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...

  2. golang切片slice

    切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 (1)var a []int 与数组不同的是他不申明长度(2)s2 := make([]int, 3, ...

  3. 在python&numpy中切片(slice)

     在python&numpy中切片(slice) 上文说到了,词频的统计在数据挖掘中使用的频率很高,而切片的操作同样是如此.在从文本文件或数据库中读取数据后,需要对数据进行预处理的操作.此时就 ...

  4. Golang 入门 : 切片(slice)

    切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...

  5. Go 灵活多变的切片Slice

    我们知道数组定义好之后其长度就无法再修改,但是,在实际开发过程中,有时候我们并不知道需要多大的数组,我们期望数组的长度是可变的, 在 Go 中有一种数据结构切片(Slice) 解决了这个问题,它是可变 ...

  6. 7 切片slice

    include 切片 切片的日常用法 切片slice 其本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或者 为引用类型. 可以直接创建或从底层数组获取生成. 使用le ...

  7. go递归函数如何传递数组切片slice

    数组切片slice这个东西看起来很美好,真正用起来会发现有诸多的不爽. 第一,数组.数组切片混淆不清,使用方式完全一样,有时候一些特性又完全不一样,搞不清原理很容易误使用. 第二,数组切片的appen ...

  8. [PY3]——内置数据结构(9)——线性结构与切片/命名切片slice()

    线性结构的总结 列表list  元组tuple  字符串str  bytes  bytearray的共同点: 都是顺序存储.顺序访问的: 都是可迭代对象: 都可以通过索引访问 线性结构的特征: 可迭代 ...

  9. Go语言【第十二篇】:Go数据结构之:切片(Slice)、范围(Range)、集合(Map)

    Go语言切片(Slice) Go语言切片是对数组的抽象,Go数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数 ...

  10. go中的数据结构切片-slice

    1.部分基本类型 go中的类型与c的相似,常用类型有一个特例:byte类型,即字节类型,长度为,默认值是0: bytes = []btye{'h', 'e', 'l', 'l', 'o'} 变量byt ...

随机推荐

  1. taro+vue3模板-废弃

    一.初始化 1.Taro 基本安装并初始化项目 npx @tarojs/cli init WechatAppDemo 2.cd到新项目的文件夹 3.安装依赖:yarn 4.运行预览: yarn dev ...

  2. android手机无线调试

    1.手机与电脑先通过usb链接2.adb devices查看是否链接成功(链接成功会显示设备列表)3.adb tcpip 5555(0-65535之间取值,默认5555输进去)5:断开数据线,查看手机 ...

  3. mariadb数据库用户管理(创建、赋权、)

    数据库查看当前用户 select user(): MariaDB [(none)]> select user(); +----------------+ | user() | +-------- ...

  4. 剪裁正方形图片cropper

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  5. 知识图谱demo net core + neo4j

    知识图谱 基于neo4j数据库和.net core开发环境 Neo4j数据库的安装 安装neo4j数据库之前,需安装java的JDK文件,安装版本需与数据库保持一致,较新的neo4j数据库都需要至少j ...

  6. 查看Linux系统的一些信息

    1.查看物理cpu个数 grep 'physical id' /proc/cpuinfo | sort -u | wc -l cat /proc/cpuinfo | grep "physic ...

  7. 解决 使用 params 传递参数 必须 加上 name

    {path:'/blog',name:'blog',params:{is:true}}

  8. spring的作用

    Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB.如果你仅仅使用了Struts或其他的包含了J2EE特有API的framework,你会发现Spring关注了遗留下的问题.Sprin ...

  9. Leetcode本地阅读器开发--01界面设计二

    返回项目声明及目录:Leetcode本地阅读器开发--总声明 继续上一节内容: 1.第一个内容是左边第一行的功能,读取默认路径和修改路径.此路径为本地阅读器的搜索题目的主目录. 为了整个程序都能读取工 ...

  10. 使用cpu-z简单看处理器,显卡等

    心血来潮想了解一下自己的电脑.在网上搜索cpu-z,大小只有几百kb.下面以我自己电脑为例,上图: 某些地方我也不是很了解,不太了解的我就直接跳过了.在网上查阅相关资料后,有下面的认识: (1)处理器 ...