加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang数组和切片

发布时间:2020-12-16 09:41:30 所属栏目:大数据 来源:网络整理
导读:1、数组 golang中的数组是一种由固定长度和固定对象类型所组成的数据类型。例如下面: var a [4]int a是一个拥有4个int类型元素的数组。当a一旦被声明之后,元素个数就被固定了下来,在a这个变量的生命周期之内,元素个数不会发生变化。而此时a的类型就是[4]

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,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,5} 
slice2 := []int{5,3} 

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

切片详解

http://www.jianshu.com/p/030a...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读