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. mysql 删除商品名字重复数据,同时保留最新一条

    delete goods where goods_id in (SELECT goods_id FROM goodswhere goods_name in (select goods_name fro ...

  2. SDCC 学习

    单个led.c文件 #include <stdbool.h> __sfr __at(0xb0) P3; __sfr __at(0x88) TCON; __sfr __at(0x89) TM ...

  3. 【ZYNQ学习】各个主题的值得看的博客

    在学习ZYNQ时会遇到不少问题,这时我们一方面要在DocNav找Xilinx的官方文档,另一方面要参考别人的一些记录的解决好的办法,我在学习的时候看到了不少大佬的博客,给我带来了很大帮助.在这篇博客, ...

  4. 统计学习导论(ISLR)(三):线性回归(超详细介绍)

    统计学习导论(ISLR) 参考资料: The Elements of Statistical Learning An Introduction to Statistical Learning 统计学习 ...

  5. redis之redisObject对象

    redisObject对象 无论什么数据类型,redis都是以key-value形式保存,并且所有的key都是字符串redis每存储一条数据,都会生成一个redisObject对象,通过redisOb ...

  6. linux三权分立账号创建

    系统管理员 创建系统管理员(sys用户)并设置密码 [root@localhost ~]# useradd sys [root@localhost ~]# passwd sys 创建组并将用户添加到组 ...

  7. 什么是压测,为什么要进行压力测试?Jmeter工具的使用

    1.背景介绍 什么是压测? 压力测试是通过不断向被测系统施加"压力",测试系统在压力情况下的性能表现,考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在,也就是我们可 ...

  8. win7下MongoDB安装配置

    之前看windows下安装MongoDB操作很是简单,今天在自己笔记本上安装一次,各种小问题.参照网上各大神帖子,再记录下个简单流程以便以后记得. 1.MongoDB官网上下载安装包 2.运行安装包, ...

  9. Optional类与使用==判断null有什么区别?使用Optional类有什么优势?

    1.使用object==null的例子 2.null带来的问题 3.其他语言中null的处理(替代) 4.Java8的Optional类 4.1 这样做有什么好处呢? 4.2 引入Optional类的 ...

  10. 西瓜书6.2 matlab的libsvm使用

    因为python的教程没有找到详细的所以就改用matlab了 使用的是matlab r2016a,libsvm3-24,具体的安装配置教程就直接参考谦恭大大的了: https://blog.csdn. ...