Golang 拷贝Array或Slice

Golang 拷贝Array或Slice

Golang中Array是值类型而slice是引用类型。因此两者之间的赋值或拷贝有些差异,本文带你了解各自的差异。

1. 拷贝array

前面提及数组是值类型,所以数组变量名不是指向第一个元素的指针。事实上它表示整个数组,下面两者情况将自动创建数组:

  • 数组变量赋值给另一个数组变量
  • 数组变量传递作为函数参数

请看示例:

package main

import "fmt"

func main() {
    sample1 := [2]string{"a", "b"}
    fmt.Printf("Sample1 Before: %v\n", sample1)
    sample2 := sample1
    sample2[0] = "c"
    fmt.Printf("Sample1 After assignment: %v\n", sample1)
    fmt.Printf("Sample2: %v\n", sample2)
    test(sample1)
    fmt.Printf("Sample1 After Test Function Call: %v\n", sample1)
}
func test(sample [2]string) {
    sample[0] = "d"
    fmt.Printf("Sample in Test function: %v\n", sample)
}

输出结果:

Sample1 Before: [a b]
Sample1 After assignment: [a b]
Sample2: 
Sample in Test function: [d b]
Sample1 After Test Function Call: [a b]

我们稍作解释:

  • sample1 赋给 sample2 ,然后修改sample2中第一个元素。打印sample1验证是否有影响,当然没有改变。这是因为sample1 赋给 sample2,会创建sample1的拷贝给sample2,故修改sample2不影响sample1.

  • 传递sample1给test函数,然后在函数体内修改其第一个元素。之后打印sample1验证是否有影响,当然也没有。原因是一样的,当sample1作为参数传递给test时,sample1的拷贝被创建并传入,因此修改不会影响原来sample1.

2. 拷贝slice

Golang内置包提供copy函数能够拷贝slice,函数前面如下,其返回拷贝元素个数:

func copy(dst, src []Type) int

使用copy函数需要考虑两种情况:

  • 如果src长度大于dst,那么仅拷贝dst长度个元素

  • 如果dst长度大于src,那么仅拷贝src长度个元素

总结为拷贝两者最小长度元素:min(src,dst)

需要注意的是,一旦拷贝完成,对目标的修改不会影响源,反之亦然。
我们也通过示例说明:

package main

import "fmt"

func main() {
    src := []int{1, 2, 3, 4, 5}
    dst := make([]int, 5)

    numberOfElementsCopied := copy(dst, src)
    fmt.Printf("Number Of Elements Copied: %d\n", numberOfElementsCopied)
    fmt.Printf("dst: %v\n", dst)
    fmt.Printf("src: %v\n", src)

    //After changing numbers2
    dst[0] = 10
    fmt.Println("\nAfter changing dst")
    fmt.Printf("dst: %v\n", dst)
    fmt.Printf("src: %v\n", src)
}

输出如下:

Number Of Elements Copied: 5
dst: [1 2 3 4 5]
src: [1 2 3 4 5]

After changing dst
dst: [10 2 3 4 5]
src: [1 2 3 4 5]

3. 总结

本文介绍了Go Array和Slice直接拷贝。Array是值类型直接赋值即拷贝,Slice是引用类型,直接赋值是指针会影响源Slice,但可以通过内置copy函数实现赋值功能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值