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() { ...
随机推荐
- bcp和load table
使用BCP和LOAD TABLE联合完成Sybase IQ 的数据导出和导入工作.说明: 表(视图)GN_TEST只有两个字段,TIMEID和MSISDN, 导出时我用'|'作为字段分隔符,'& ...
- centos7使用cobbler(2.8)批量部署操作系统之一
一. 批量部署操作系统的前提 要想批量部署操作系统,得具备以下条件: 客户机支持pxe网络引导 服务器端和客户端建立网络通信(DHCP) 服务器端要有可供客户机开机引导的引导文件 服务器端的可引 ...
- Samba远程代码执行漏洞(CVE-2017-7494)本地复现
一.复现环境搭建 搭建Debian和kali两个虚拟机: 攻击机:kali (192.168.217.162): 靶机:debian (192.168.217.150). 二.Debian安装并配置s ...
- python新手之一环境安装
今天开始学习python,首先环境安装 1.在https://www.python.org/downloads/下载python2.X或者3.X(ps:这里建议下载32位的python ,因为64位p ...
- Ubuntu彻底删除/卸载mysql,php,apache
一.卸载删除 mysql 1 sudo apt-get autoremove --purge mysql-server-5.02 sudo apt-get remove mysql-server3 s ...
- PhpStrom如何安装主题?(总结三种不同格式安装方法)
在网上搜了很多都是不怎么齐全的方法,在这里我总结一下PhpStrom的三种不同格式的安装方法,以后就不用再去网上搜直接看我自己的博客就知道了.以下默认为Windows系统,Linux现在暂时还没更新. ...
- java调用wkhtmltopdf生成pdf文件,美观,省事
最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...
- HTML5 开发APP( 支付宝支付)
我们搞app有一个重要的功能那就是支付功能.无论是微信支付,支付宝,还是银联支付总要有一样支付手段来支持我们网上付款.实现完整的功能.我们公司app的支付方式经过大家开会讨论选择了支付宝支付(其实是当 ...
- 关于戴尔没有活动分区,遇到了“Windows安装程序无法将windows配置为在此计算机的硬件上运行”提示等
虽然只有几句话,但是还是超级好用的 装过很多戴尔的笔记本,发现很多都是这里的问题导致系统装不进去. 1.硬盘设置有问题.进BIOS ,到SATA 设置看看硬盘是不是设置为AHCI了.这个ghost系统 ...
- python几种常见语法
NO1.type自动匹配类型 name="zhangsan"age=18 print (type(name))#type自动匹配类型 print ("name:%s,ag ...