博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go slice和数组的区别
阅读量:6621 次
发布时间:2019-06-25

本文共 1176 字,大约阅读时间需要 3 分钟。

1.使用方式

数组和slice长的很像,操作方式也都差不多,并且slice包含了数组的基本的操作方式,如下标、range循环,还有一些如len()则是多种类型共用,所以根据操作根本搞不清数组和切片的区别,能够看出区别的地方主要看如何声明的。

数组的声明方式很单一,通常就是下面这样:

array1 := [5]int{1, 2, 3, 4, 5}array2 := [5]int{}

slice的声明方式就非常多样了,如前面介绍的几种:

var slice1 = []int{1, 2, 3, 4, 5}var slice2 = make([]int, 0, 5)var slice3 = make([]int, 5, 5)var slice4 = make([]int, 5)

加上对数组的切片和append操作都会产生数组切片(slice)

2.值传递or引用传递

func arrayModify(array [5]int) {    newArray := array    newArray[0] = 88}func sliceModify(slice []int) {    newSlice := slice    newSlice[0] = 88}func main() {    array := [5]int{1, 2, 3, 4, 5}    slice := []int{1, 2, 3, 4, 5}    arrayModify(array)    sliceModify(slice)    fmt.Println(array)    fmt.Println(slice)}

输出

[1 2 3 4 5][88 2 3 4 5]

其实不只是数组,go语言中的大多数类型在函数中当作参数传递都是值语义的。也就是任何值语义的一种类型当作参数传递到调用的函数中,都会经过一次内容的copy,从一个方法栈中copy到另一个方法栈。这对于熟练java的同学需要进行一次彻底的观念转变,在java中除了少数的值类型是按照值传递,所有的类在函数传递时都是具有引用语义的,也就是通过指针传递。所以在使用时传递对象,不需要去分别值和引用。

go说到底不是一种纯粹的面向对象的语言,更多的是一种更简单高效的C,所以在参数传递上跟C保持着基本的一致性。一些较大的数据类型,比如结构体、数组等,最好使用传递指针的方式,这样就能避免在函数传递时对数据的copy。

虽然slice在传递时是按照引用语义传递,但是又因为append()操作的问题,导致即使是引用传递还是不能顺利解决一些问题,后面一篇文章将说明一下如何解决递归函数中传递slice的问题:

转载于:https://www.cnblogs.com/mahang/p/3273675.html

你可能感兴趣的文章
QT Basic---Widgets<1>
查看>>
Android开发10.3:UI组件GridView网格视图
查看>>
Power BI的一些视频演示资源
查看>>
Entity Framework 5.0基础系列
查看>>
使用Swift和SpriteKit写一个忍者游戏
查看>>
2014辛星在读CSS第八节 使用背景图片
查看>>
TBluetoothLEDevice.UpdateOnReconnect
查看>>
QtTableView 简介
查看>>
Linux系统上安装软件(ftp服务器)
查看>>
[iOS] App引导页的简单实现 (Swift 2)
查看>>
MHA 代码解析(online swtich+master is alive 模式)
查看>>
利用openssl进行RSA加密解密
查看>>
盒模型--边界
查看>>
14.使用通配符
查看>>
软件的模块化开发
查看>>
腾讯、百度、阿里面试经验—(3)阿里面经
查看>>
稍复杂的ionic例子:显示一个列表,并且允许点击进入列表项
查看>>
一些新的web性能优化技术
查看>>
Liferay 6开发学习(二十六):数据库连接相关问题
查看>>
【转】半路学编程,可以成为大牛吗?
查看>>