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. 【SqlServer系列】表连接

    1   概述 1.1  已发布[SqlServer系列]文章 [SqlServer系列]MYSQL安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 1.2  本篇 ...

  2. Excel多表合并的宏

    Sub 合并当前目录下所有工作簿的全部工作表() Dim MyPath, MyName, AWbName Dim Wb As Workbook, WbN As String Dim G As Long ...

  3. Mysql连接出错问题

    1.java 提示:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 处理:导入mysql-connector-java-5.1.7-bi ...

  4. jquery中append与appendTo方法区别

    1. append(content)方法 方法作用:向每个匹配的元素内部追加内容. 参数介绍:content (<Content>): 要追加到目标中的内容. 用法示例: HTML代码为& ...

  5. HDU 5547 Sudoku(DFS)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=5547 题目: Sudoku Time Limit: 3000/1000 MS (Java/Others ...

  6. jvm007 jvm知识点总览

    转载来自:http://www.ityouknow.com/ 在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内 ...

  7. Mybaits简诉

    先组织一下语言!Mybatis是一个框架,一个数据持久化的框架,作用就是SQL语句的映射!减少了JDBC繁琐的数据操作与类型转换!简而言之,就是方便.轻巧!什么是持久化,持久,恩,JDBC就是一个数据 ...

  8. python数据可视化(matplotlib)

  9. jar包的一生

    经常会头疼于一个jar包是如何制作的,包括maven的打包方式,springboot的打jar包的原理,jar包稍稍有错误就会完全无法运行.在网上折腾了很久终于有些思路和步骤,在这里做个笔记 本文大纲 ...

  10. 阿里云服务器怎么运行多个项目(Nginx)

    server { listen 80; server_name yy.test.cn; access_log /data/wwwlogs/access_nginx.log combined; root ...