golang中Array与Slice

在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定义)。

转载于:https://www.cnblogs.com/cord/p/10865197.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值