go slice和数组的区别
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的问题:
go slice和数组的区别的更多相关文章
- [Golang]-1 Slice与数组的区别
目录 数组 1.创建数组: 2.数组是值拷贝传递: 切片(slice) 1.首先看看slice的源码结构: 2.slice的创建: 3.slice使用make创建 4.切片作为参数传递 5.Golan ...
- 数组的常用方法concat,join,slice和splice的区别,map,foreach,reduce
1.concat()和join() concat()是连对两个或两个数组的方法,直接可以将数组以参数的形式放入 join()是将数组中的所有元素放入一个字符串中,通俗点讲就是可以将数组转换成字符串 2 ...
- JavaScript中的数组与伪数组的区别
在JavaScript中,除了5种原始数据类型之外,其他所有的都是对象,包括函数(Function). 基本数据类型:String,boolean,Number,Undefined, Null 引用数 ...
- split slice splice的简单区别
split slice splice的简单区别 split: 分割 //字符串方法 string.split let str = 'hello world'; //str.split('') 以什么东 ...
- null和undefined的区别、数组和伪数组的区别
null和undefined的区别 undefined: 字面意思是未定义的值,语义是希望表示一个变量最原始的状态,而非人为操作的结果.这种原始状态会在以下四个场景中出现: 声明了一个变量但没有赋值 ...
- C++中关于[]静态数组和new分配的动态数组的区别分析
这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加 ...
- C-指针和数组的区别
指针的操作: 允许:1)同类型指针的赋值 2)与整形的加减运算 3)指向同一数组内指针的减运算和比较 4)赋 ‘0’ 或与 ‘0’ 比较 不允许:1)两指针的相加,相乘除,位移或mask 2)与flo ...
- Java基础知识强化之集合框架笔记01:集合的由来与数组的区别
1. 集合的由来: 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储.而要想存储多个对象,就不能是一个基本的变量,而应该 ...
- json 和 数组的区别
json是javascript中的一种数据格式,类似于数组,但又不同于数组,区别在于下标: 例如,var obj=[a:15,b:10,c:3,d:8]: //这是json的写法 var arr=[ ...
随机推荐
- scala的hello world出现的问题
build出现: Error:scalac: Error: org.jetbrains.jps.incremental.scala.remote.ServerExceptionError compil ...
- Scrapy下xpath基本的使用方法
Scrapy是基于python的开源爬虫框架,使用起来也比较方便.具体的官网档:http://doc.scrapy.org/en/latest/ 之前以为了解python就可以直接爬网站了,原来还要了 ...
- 静态编译opencv3.4.0
问题: 编译了静态库之后可以不要那么多dll 解决办法: 其实和编译动态库的区别就在于: Cmake里面操作的时候,去掉下面这个选项的勾勾 BUILD_SHARED_LIBS
- WHEN STATICFILEHANDLER IS NOT STATICFILEHANDLER
I could also have called this "wildcard .NET mapping in IIS Express from web.config." I'm ...
- 在react-native中使用es7语法中的decorator装饰器
在react-native中默认使用decorator会红屏报错,需要安装一个babel插件: babel-plugin-transform-decorators-legacy 然后在根目录下的.ba ...
- Neo4j在Centos7下的安装笔记
首先,要在官网找到tar的安装包路径,然后使用wget来安装.下载之后解压. 然后运行 bin/neo4j start 就可以启动了. 启动之后防火墙开放7474,发现仍然访问不了. 因为这里和win ...
- 一些css杂项笔记
div[class*="col-"]{ background-color: gold; border: 1px solid #ccc; } //给class开头等于col-的div ...
- RmNet,CDC-ECM ,NDIS,RNDIS区别
RmNet和CDC-ECM区别:更像是两种拨号方式的区别,RmNet获取公网IP,ECD-ECM获取局域网IP. 在高通平台上,rmnet driver 和标准的CDC-ECM是有区别的,rmnet ...
- C++并发编成 03 线程同步
这一节主要讲讲线程同步的方式,C++ 11中提供了丰富的线程同步元语,如condition_variable,futrue,std::packaged_task<>,std::promis ...
- python拓展2 collections模块与string模块
知识内容 1.collections模块介绍 2.collections模块使用 3.string模块介绍及使用 一.collections模块介绍 collections模块中提供了很多python ...