Go 语言切片(Slice)

Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

定义切片

你可以声明一个未指定大小的数组来定义切片:

var identifier []type

切片不需要说明长度。

或使用make()函数来创建切片:

var slice1  = make([] type, len)

或者写成如下
slice1 := make([] type, len)

也可以指定容量,其中capacity为可选参数

slice1 := make([] type, len, capacity)

切片的实例

 package main

 import (
"fmt"
) func main() {
//初始化数组blance,元素为1,2,3,4,5,6
var blance = [] int{, , , , , }
//初始化数组slice1因为没有给值,所以默认填充了3个0
var slice1 = make([] int, ,) //输出数组的初始化的值
fmt.Println("初始化数组blance的值:", blance)
fmt.Println("初始化数组slice1的值:", slice1) //切片的操作,可以通过索引取值
fmt.Println("blance数组中第二个索引的值为:",blance[]) //修改blance数组中最后一个值
blance[] =
fmt.Println("修改blance数组最后一个值以后的结果:",blance) //使用切片给s数组赋值,从blance数组中的第0个索引取到第三个索引,但不包含第三个索引的值
s := blance[:]
fmt.Println("blance数组切片获取的数组s的值:", s) }

以上代码执行的结果:

初始化数组blance的值: [     ]
初始化数组slice1的值: [ ]
blance数组中第二个索引的值为:
修改blance数组最后一个值以后的结果: [ ]
blance数组切片获取的数组s的值: [ ]

len() 和 cap() 函数

切片是可索引的,并且可以由 len() 方法获取长度。

切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少

 package main

 import (
"fmt"
) //len可以获取数组的总长度,cap可以获取切片最大的长度
func printSlice(x [] int,name string ){
fmt.Printf("len=%d cap=%d %v=%v \n", len(x), cap(x) ,name , x )
fmt.Println("--------------------------------")
} func main() {
//初始化数组blance,元素为1,2,3,4,5,6
var blance = [] int{, , , , , } //调用打印切片的函数
printSlice(blance,"blance") //初始化一次数组最大长度为8个,初始化填充3个0的数组s
s := make([] int, ,)
fmt.Println("初始化数组s的值为:", s) //调用打印切片的函数
printSlice(s,"s") }

以上代码执行的结果:

len= cap= blance=[     ]
--------------------------------
初始化数组s的值为: [ ]
len= cap= s=[ ]
--------------------------------

append() 和 copy() 函数

如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。

下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。

 package main

 import (
"fmt"
) //len可以获取数组的总长度,cap可以获取切片最大的长度
func printSlice(x [] int,name string ){
fmt.Printf("len=%d cap=%d %v=%v \n", len(x), cap(x) ,name , x )
fmt.Println("--------------------------------")
} func main() {
var numbers [] int
printSlice(numbers,"numbers") //追加空切片
numbers = append(numbers,)
printSlice(numbers,"numbers") //追加一个元素
numbers = append(numbers,)
printSlice(numbers,"numbers") //同时追加多个元素
numbers = append(numbers,, , )
printSlice(numbers,"numbers") //创建n1数组是numbers的两倍的容量
n1 := make([] int, len(numbers), len(numbers)*)
printSlice(n1,"n1") //拷贝numbers数组中的内容到n1中,会在对应的索引的地方覆盖已有的内容
copy(n1, numbers)
printSlice(n1,"n1") //声明局部数据test,初始化元素两个2,数组允许最大3个元素
test := make([] int,,)
printSlice(test,"test")
//往test数组中添加数据,因为超过了最大长度的3个,go会维持内存,会另外申请一个乘以最大容量*2的容量赋值给test数组
test = append(test,, ,)
printSlice(test,"test")
}

以上代码执行的结果:

len= cap= numbers=[]
--------------------------------
len= cap= numbers=[]
--------------------------------
len= cap= numbers=[]
--------------------------------
len= cap= numbers=[ ]
--------------------------------
len= cap= n1=[ ]
--------------------------------
len= cap= n1=[ ]
--------------------------------
len= cap= test=[ ]
--------------------------------
len= cap= test=[ ]
--------------------------------

Go语言的切片的更多相关文章

  1. go语言 rune切片

    go语言 rune切片 示例 package main import ( "fmt" ) //http://www.cnblogs.com/osfipin/ func main() ...

  2. go语言之切片即动态数组

    切片和数组的类型有什么不一样,我们可以打印一下,就可以知道两者的区别了,数组是容量的,所以中括号中有容量,切片的动态数组,是没有容量,这是数组和切片最大的区别 test8_4 := [20] int ...

  3. Go语言中切片的内部实现和基础功能

    切片是一种数据结构,这种数据结构便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数append来实现的.这个函数可以快速且高效的增长切片.还可 ...

  4. GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素

    append()方法为切片添加元素 注意:通过var声明的零值切片可以在append()函数直接使用,无需初始化. var s []int s = append(s, 1, 2, 3) append( ...

  5. go语言笔记——切片函数常见操作,增删改查和搜索、排序

    7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如  ...

  6. go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针

    切片 切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型) ...

  7. GO语言学习——切片一

    切片(slice) 数组的长度的固定的.是声明之后不能变的.是类型的一部分 切片是一个引用类型 切片的定义 声明切片类型的基本语法如下: var name []T 其中, name:表示变量名 T:表 ...

  8. GO语言学习——切片二

    使用make()函数构造切片 格式: make([]T, size, cap) 其中: T:切片的元素类型 size:切片中元素的数量 cap:切片的容量 切片的本质 切片的本质就是对底层数组的封装, ...

  9. Go语言的切片slice基本操作

    感觉比数组好用,首选. package main import ( "fmt" ) //main is the entry of the program func main() { ...

随机推荐

  1. MapReduce执行流程及程序编写

    MapReduce 一种分布式计算模型,解决海量数据的计算问题,MapReduce将计算过程抽象成两个函数 Map(映射):对一些独立元素(拆分后的小块)组成的列表的每一个元素进行指定的操作,可以高度 ...

  2. SQL执行过程中的性能负载点

    一.SQL执行过程 1.用户连接数据库,执行SQL语句: 2.先在内存进行内存读,找到了所需数据就直接交给用户工作空间: 3.内存读失败,也就说在内存中没找到支持SQL所需数据,就进行物理读,也就是到 ...

  3. 从源码的角度看Service是如何启动的

    欢迎访问我的个人博客 ,原文链接:http://wensibo.top/2017/07/16/service/ ,未经允许不得转载! 七月中旬了,大家的实习有着落了吗?秋招又准备的怎么样了呢?我依旧在 ...

  4. 关于Actionbar的那些事

    咱们来说说有趣的Actionbar吧 Actionbar这个控件是3.0以后添加的,Google在13年的时候把它加入了v7包,现在第三方的Actionbarserlock基本没什么用了, 要兼容2. ...

  5. python模块之os模块详解

    os.listdir(dirname):列出dirname下的目录和文件 os.getcwd():获得当前工作目录 os.curdir:返回当前目录('.') os.chdir(dirname):改变 ...

  6. 小哈学Python第三课-字符集编码

    table.hovertable { font-family: verdana, arial, sans-serif; font-size: 11px; color: #333333; border- ...

  7. 在ubuntu下使用minicom连接交换机/路由器Console口

    首先下载并安装minicom sudo apt-get install minicom 然后将Console线一端连上交换机的Console口,另一端连上电脑(我这里是通过USB口连接的) 然后查看对 ...

  8. Echarts折线图表断点如何补全

    Echarts折线图如何补全断点以及如何隐藏断点的title 做报表的时候,尤其是做图表的时候时常会碰到某一记录的值中缺少某个时间段(比如月份或季度)的值,导致图表显示残缺不全,for example ...

  9. Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError

    解决Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError 表示我们不编译jni代码,直接从libs里面复制so库 文件路径:app\buil ...

  10. python有三种导入模块的方法(转)

    原文:http://www.cnblogs.com/allenblogs/archive/2011/11/15/2055149.html python有三种导入模块的方法 其一, import mod ...