golang切片和数组

杰克慢 · · 936 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1、数组

golang中的数组是一种由固定长度和固定对象类型所组成的数据类型。例如下面:

var a [4]int

    a是一个拥有4个int类型元素的数组。当a一旦被声明之后,元素个数就被固定了下来,在a这个变量的生命周期之内,元素个数不会发生变化。而此时a的类型就是[4]int,如果同时存在一个b变量,为[5]int。即便两个变量仅仅相差一个元素,那么在内存中也占据着完全不同的地址分配单元,a和b就是两个完全不同的数据类型。在golang中,数组一旦被定义了,那么其内部的元素就完成了初始化。也就是时候a[0]等于0。

    在golang当中,一个数组就是一个数据实体对象。在golang当使用a时,就代表再使用a这个数组。而在C中,当使用a时,则代表着这个数组第一个元素的指针。

2、切片

letters := []string{"a", "b", "c", "d"}

数组声明时候方括号内需要写明数组的长度或者使用(...)符号自动计算长度,切片不需要指定数组的长度。比较规范的声明方式是使用make,大致有两种方式

1、只指定长度,这个时候切片长度和容量相同;

2、同时指定切片的长度和容量。

var s1 = make([]byte, 5)
var s2 = make([]byte, 5, 10)

由于切片是 引用类型 ,因此当引用改变其中元素的值时候,其他的所有引用都会改变该值。例如

var a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := a[:4]
s2 := a[3:7]
fmt.Println(s1)
fmt.Println(s2)
s1[3] = 100
fmt.Println(s1)
fmt.Println(s2)

结果是:

[1 2 3 4]

[4 5 6 7]

[1 2 3 100]

[100 5 6 7]

从概念上看,切片像是一个结构体,包含了三个元素:

1、一个指向数组中切片指定的开始位置;

2、长度,即切片的长度,通过内置函数len获得;

3、最大长度,即切片的最大容量,通过内置函数cap获得。

如果len比cap还大,那么就会触发运行时异常。

    golang提供append函数来添加元素,当使用append函数时,append函数会判断目的切片是否具有剩余空间,如果没有剩余空间,则会自动扩充两倍空间。

    golang提供copy用于将内容从一个数组切片复制到另一个数组切片。如果加入的两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制。

slice1 := []int{1, 2, 3, 4, 5} 
slice2 := []int{5, 4, 3} 

copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中 
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置

 


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:杰克慢

查看原文:golang切片和数组

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

936 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传