Go语言的切片
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语言的切片的更多相关文章
- go语言 rune切片
go语言 rune切片 示例 package main import ( "fmt" ) //http://www.cnblogs.com/osfipin/ func main() ...
- go语言之切片即动态数组
切片和数组的类型有什么不一样,我们可以打印一下,就可以知道两者的区别了,数组是容量的,所以中括号中有容量,切片的动态数组,是没有容量,这是数组和切片最大的区别 test8_4 := [20] int ...
- Go语言中切片的内部实现和基础功能
切片是一种数据结构,这种数据结构便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数append来实现的.这个函数可以快速且高效的增长切片.还可 ...
- GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素
append()方法为切片添加元素 注意:通过var声明的零值切片可以在append()函数直接使用,无需初始化. var s []int s = append(s, 1, 2, 3) append( ...
- go语言笔记——切片函数常见操作,增删改查和搜索、排序
7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如 ...
- go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针
切片 切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型) ...
- GO语言学习——切片一
切片(slice) 数组的长度的固定的.是声明之后不能变的.是类型的一部分 切片是一个引用类型 切片的定义 声明切片类型的基本语法如下: var name []T 其中, name:表示变量名 T:表 ...
- GO语言学习——切片二
使用make()函数构造切片 格式: make([]T, size, cap) 其中: T:切片的元素类型 size:切片中元素的数量 cap:切片的容量 切片的本质 切片的本质就是对底层数组的封装, ...
- Go语言的切片slice基本操作
感觉比数组好用,首选. package main import ( "fmt" ) //main is the entry of the program func main() { ...
随机推荐
- 51Nod 1509加长棒
传送门 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1509 现在有三根木棒,他们的长度分别是a,b,c厘米.你可以对他 ...
- webpack教程(三)——热刷新
现在我们如果修改代码,需要重新打包,再一次在命令行下输入webpack命令,很麻烦. 热刷新是什么呢?就是我们该完代码保存之后webpack会自动打包引起浏览器自动刷新,你只需要把精力都专注在代码研发 ...
- jsp获取当前日期,包括星期几
<%@ page language="java" pageEncoding="GB2312" %> <html> <head> ...
- Unity3D文件读取
Resources: 是作为一个Unity3D的保留文件夹出现的,也就是如果你新建的文件夹的名字叫Resources,那么里面的内容在打包时都会被无条件的打到发布包中.它的特点简单总结一下就是: 只读 ...
- nyoj_3:多边形重心问题(计算几何)
基础的计算几何 多边形的n个顶点按*时针方向给出 由任意n边形可分解为n-2个三角形,各三角形面积面积与重心易得,故有各三角形的面积及重心 用重心公式可求得多边形的面积与重心 题目链接: http:/ ...
- Spring初学
一.spring体系结构spring核心组件 1.Beans(包装应用程序自定义对象Object,Object中存有数据) 2.Core (资源加载,资源抽象,建立维护与bean之间的一些关系所需的一 ...
- effective java 第2章-创建和销毁对象 读书笔记
背景 去年就把这本javaer必读书--effective java中文版第二版 读完了,第一遍感觉比较肤浅,今年打算开始第二遍,顺便做一下笔记,后续会持续更新. 1.考虑用静态工厂方法替代构造器 优 ...
- tar命令(转)
把常用的tar解压命令总结下,当作备忘: tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个, ...
- 程序员面试必备-链表各种操作及其实现方法(c实现)
链表是一种最简单的数据结构之一,经常会被面试官用来考察应聘者的基础扎不扎实,最近也到了求职季,所以我把自己对链表的一些理解写出来,希望能跟大家交流交流: 链表的概念其实挺简单,无非就是一个利用指针将数 ...
- Charles录制App的接口har文件
Charles录制App的接口har文件 如果我们想录制我们自己App后台请求接口的信息,并生成har文件,要怎么做呢?其实很简单,就是通过Charles,让手机的访问请求走这个Charles代理就行 ...