在golang中有数组和Slice两种数据结构,Slice是基于数组的实现,是长度动态不固定的数据结构,本质上是一个对数组字序列的引用,提供了对数组的轻量级访问。那么在go的函数中以数组或Slice为形参的时候就存在一些差别。

​ 首先,golang中是值传递,并且如果传递的参数是数组的时候并不会隐式将数组作为引用或者指针传入,而是传入副本,而如果想轻量级传递数据,这个时候就需要使用slice了。

可以通过一个简单的例子来验证这个机制:

package main

import "fmt"

func main()  {
array := [4]int{1, 2, 3, 4}
fmt.Printf("实参array地址:%p\n", &array)
printArray(array)
printSlice(array[0:4])
} func printArray(array [4]int) {
fmt.Printf("形参array地址:%p\n", &array)
for _, e := range array {
fmt.Print(e)
}
fmt.Println()
} func printSlice(array []int) {
fmt.Printf("形参slice地址:%p\n", &array)
for _, e := range array {
fmt.Print(e)
}
fmt.Println()
}

运行结果如下:

实参array地址:0xc0000480a0
形参array地址:0xc0000480e0
1234
形参slice地址:0xc000044420
1234

运行结果表明,如果形参是数组的话,那么相当于传递的是一份数组的拷贝,形参和实参的地址均相同,而如果形参是slice的话,传递的则是引用而不是拷贝。

同时,如果形参是数组,那么Slice变量是无法传入的,反之亦然。

另外,数组的几种定义方式也有区别:

例如[...]int{1,2,3,4}这是一个数组,能够printArray([...]int{1,2,3})printSlice([...]int{1,2,3}[0:1]) 这两种方式使用,而[]int{}则实际上是一个slice,所以可以printSlice([]int{}),但是如果printArray([]int{})则编译器会报错。所以定义数组的时候如果指定了长度或者[...]int{1,2,3}这种自动初始化长度的情况则返回的是数组,而如果没有指定长度则返回的是slice。

结论:如果要传递拷贝则使用数组作为形参,如果要传递引用则使用slice作为形参。定义数组需要指定长度,定义slice不能指定长度(或者使用make定义)。

最新文章

  1. <canvas>设置宽高遇到的问题
  2. jquery中bind()绑定多个事件
  3. Java针对数据库增删改查代码
  4. js关于事件
  5. [zt]Which are the 10 algorithms every computer science student must implement at least once in life?
  6. Web App之一
  7. Windows.Andy.Code4App.dll Win8.1/WP8.1通用类库@ver1.0.1
  8. light开发框架
  9. iOS相关,过年回来电脑上的证书都失效了,解决方法。
  10. 如何与 DevOps 为伍?
  11. 【.Net Remoting-1】
  12. JAVA HashMap与HashTable 区别
  13. UIBarButtonItem 小记边
  14. linux-Centos6.5中nginx1.63源码安装
  15. [译]AngularJS 1.3.0 开发者指南(一) -- 介绍
  16. Java:双括号初始化 /匿名内部类初始化法
  17. org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably du
  18. x264源代码简单分析:概述
  19. 2019-4-21 - plan
  20. django-simple-captcha 组件使用

热门文章

  1. 《机器学习技法》---线性SVM
  2. 编译Assimp傻瓜教程
  3. PL/SQL 调用JAVA使用UDP发送数据
  4. 5 X 5 方阵引出的寻路算法 之 路径遍历(完结)
  5. 用代码说话:synchronized关键字和多线程访问同步方法的7种情况
  6. ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证
  7. Visual Studio 2019 远程调试工具(Remote Debugger)使用方法
  8. JMeter用户参数
  9. 新手学习FFmpeg - 调用API完成录屏
  10. HDU 6055