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. Machine Learning and Data Mining Lecture 1

    Machine Learning and Data Mining Lecture 1 1. The learning problem - Outline     1.1 Example of mach ...

  2. JavaScript+svg绘制的一个动态时钟

    结果图: 代码如下: <!DOCTYPE html> <html> <head> <title>动态时钟</title> </head ...

  3. Intellij Idea配置说明(从Eclipse转Idea)

      1.idea的字体大小设置 字体大小设置的方法: 进入Settings>>Editor>>Colors&Fonts>>Font,改变Size大小. 2. ...

  4. 列表的系列操作(python)

    除了定义和切片外,这里总结下系列的操作: # hanbb come on! names = ["hbb",'tian','bao','cheng'] #Add names.appe ...

  5. 字符串(String)

    字符串 字符串就是用引号引起来的一段文字.字母.数字-- 例如: "这是字符串"."zheshizifuc"."6666" 使用字符串的方法 ...

  6. CentOS7的网卡启动不起来的问题

    这个问题在刚学Linux遇到的,centOS7的网卡启动不起来,导致建不了集群.如下图没有ifconf-env33网卡的IP 还有下面这个图>>> 如果你遇到了,呵呵呵,迷之微笑. ...

  7. 2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能

    2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能,否则极有可能被拒! 在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到20 ...

  8. 微信小程序 服务器端生成用户登陆环节的 3rd_session

    一.环境: CentOS 6.8 nginx 1.8.0 php 7.0.10 二.背景 最近在开发一个微信小程序,不可避免的涉及到登陆的环节,登录时序图如下: 通过 wx.login() 获取到用户 ...

  9. 1分钟选好最合适你的JavaScript框架

    欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~​ Javascript框架(以下简称框架)也被称为Javascript库,是一组包含丰富功能和函数的JavaScript代码集, ...

  10. 关于解决mysql数据库乱码的问题

    最近在开发的过程中频繁的使用到了mysql'这款数据库,mysql的中文乱码问题一直让人头疼.以前遇到过几次,但是都一不小心就解决了,这次终于明白到底是怎么回事了.可能我下面手的这种解决方案只适合于我 ...