脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - golang-切片slice的创建方式

golang-切片slice的创建方式

2021-05-31 00:59iRich_全栈 Golang

这篇文章主要介绍了golang-切片slice的创建方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

在创建一个新的切片是都会先创建一个长度为len的数组,并为其开辟一个cap长度为cap的额外空间,所以在cap范围类增加元素,数组的起始地址不会改变,否则会创建一个新的数组,即起始的位置发生改变

数组创建

 

代码

?
1
2
3
4
5
intArr:=[...]int{1,2,3,4,5,6,7,9}
//方式一指定开始和结束
s:=intArr[1:3]
//方式er指定开始和结束+容量
s:=intArr[1:3:6]

创建后的slice

[a: b :c]

a:起始位置

b:截取数据的结束位置 默认到末端)

c:截取后的容量位置 默认到末端)

len为截取的元素长度 即:(3 - 1=2)

cap为截取的起始元素到素组最后一个元素的长度 即:

(原数组长度:8 - 起始元素1=7)

底层数组: 为原数组的截取的起始元素到素组最后一个元素

golang-切片slice的创建方式

make创建

 

代码

?
1
s:=make([]int,10,20)

创建后的slice

len为:10

cap为:20(在创建时指定)

底层数组: 长度为10的数组

slice扩容

 

在cap范围内不会创建新的底层数组

超过cap则会创建新的数组 ,生成新的cap和len 超过cap也会的

补充:golang 中使用数组创建slice时的注意事项

golang中,slice是对固定长度数组的一段切片,其底层是用对数值空间的指针实现的。

在golang中当使用一个数组来创建slice时如:

 

?
1
2
3
var array [5]int = [5]int{1,2,3,4,5}
//切割出数组中的4个值,创建一个slice
myslice := array[0:4]

打印array的值为:

1, 2, 3, 4, 5

打印mysqlice的值为:

1, 2, 3, 4

现在我们对myslice进行append操作

 

?
1
myslice = append(myslice,100)

打印array的值为:

1, 2, 3, 4, 100

打印mysqlice的值为:

1, 2, 3, 4, 100

现在我们再对myslice进行修改操作

 

?
1
myslice[0] = 50

打印array的值为:

50, 2, 3, 4, 100

打印mysqlice的值为:

50, 2, 3, 4, 100

当slice的长度没有超过创建是的数组的长度时,slice还是指向的创建时使用的数组。

但是!

现在myslice的长度已经和用来创建slice时使用的数组的长度一致了

我们再对myslice进行append操作,让myslice的长度大于创建时使用的数组的长度

?
1
myslice = append(myslice,200)

打印array的值为:

50, 2, 3, 4, 100

打印mysqlice的值为:

50, 2, 3, 4, 100, 200

myslice不是通过指针的方式跟arr建立关联的吗?为毛这种情况却没有改变arr的值呢?

因为当myslice超出arr的长度时,Go语言会隐含式地对array做了copy,并让myslice内部的指针重新指向了新数值,所以一切预期中修改array的值的操作,都不会生效!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/weixin_37910453/article/details/86623805

延伸 · 阅读

精彩推荐
  • Golanggolang如何使用struct的tag属性的详细介绍

    golang如何使用struct的tag属性的详细介绍

    这篇文章主要介绍了golang如何使用struct的tag属性的详细介绍,从例子说起,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看...

    Go语言中文网11352020-05-21
  • Golanggolang的httpserver优雅重启方法详解

    golang的httpserver优雅重启方法详解

    这篇文章主要给大家介绍了关于golang的httpserver优雅重启的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    helight2992020-05-14
  • GolangGolang中Bit数组的实现方式

    Golang中Bit数组的实现方式

    这篇文章主要介绍了Golang中Bit数组的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    天易独尊11682021-06-09
  • GolangGolang通脉之数据类型详情

    Golang通脉之数据类型详情

    这篇文章主要介绍了Golang通脉之数据类型,在编程语言中标识符就是定义的具有某种意义的词,比如变量名、常量名、函数名等等,Go语言中标识符允许由...

    4272021-11-24
  • Golanggo日志系统logrus显示文件和行号的操作

    go日志系统logrus显示文件和行号的操作

    这篇文章主要介绍了go日志系统logrus显示文件和行号的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang json.Marshal 特殊html字符被转义的解决方法

    golang json.Marshal 特殊html字符被转义的解决方法

    今天小编就为大家分享一篇golang json.Marshal 特殊html字符被转义的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    李浩的life12792020-05-27
  • Golanggo语言制作端口扫描器

    go语言制作端口扫描器

    本文给大家分享的是使用go语言编写的TCP端口扫描器,可以选择IP范围,扫描的端口,以及多线程,有需要的小伙伴可以参考下。 ...

    脚本之家3642020-04-25
  • Golanggolang 通过ssh代理连接mysql的操作

    golang 通过ssh代理连接mysql的操作

    这篇文章主要介绍了golang 通过ssh代理连接mysql的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    a165861639710342021-03-08