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. webstrom配置ES6 file watch没有生效

    参考了文章https://www.cnblogs.com/kiimi/p/8663467.html设置后,依然没有看到编译后的文件,然后设置了输出文件夹为当前项目,再重启webstrom就看到了--

  2. using Spire.Pdf 合并文件夹下.pdf 文件

    using Spire.Pdf private void mergePDF() { List<string> filesList = new List<string>(); D ...

  3. Source Tree 1、解决打开闪退问题2、解决找不到项目的问题

    闪退问题主要做了两点 1.版本降到3.1.2 下载链接:Sourcetree Download Archives | Sourcetree 2.参考博客做出文件修改参考bigbig猿博客 新建json ...

  4. C语言printf输出32位十六进制

    long c = 0X1DAB83; //十六进制数字 printf("c=%lx\n", c); //以十六进制形式输出(字母小写) printf("c=%lX\n&q ...

  5. Qframework UIKit

    用QFramework的UIKit 功能很容易实现UI模块的MVC功能,但MVC模式构造起来还是会有些繁琐, 两个相互直接的UIElement 之间的一些数据传输和调用都要用Msg通过UIPanel ...

  6. element ui 分页

    修改选中页码的样式: .el-pager .active{ color:red !important;//选中 } .el-pager .number:hover{ color:red !import ...

  7. labwindows excel 不同电脑上无法保存

    存到c盘以外的盘,c盘因为权限问题可能无法写入

  8. net/http

    客户端 GET POST form表单 json body二进制流 上传文件 PUT DELETE HEAD 重定向 Client Request Response Cookie CookieJar ...

  9. 实验一 密码引擎-1-OpenEuler-OpenSSL编译

    1. 下载最新的OpenSSL源码 2. 用自己的8位学号建立一个文件夹,cd 你的学号,用pwd获得绝对路径 3. 参考https://www.cnblogs.com/rocedu/p/508762 ...

  10. redis - 常用方法封装总结

    package com.citydo.utils; import org.springframework.data.redis.connection.DataType; import org.spri ...