美文网首页
Golang:数组与切片的复制

Golang:数组与切片的复制

作者: 李小西033 | 来源:发表于2020-06-09 20:40 被阅读0次

在Golang中,数组是值类型而切片是引用类型。因此值的复制与切片的复制并不相同。

数组的复制

对于值类型的数组来说,变量指向的并不是第一个元素的指针,而是整个数组。以下情况会发生数组的复制:

  • 将数组变量赋值给另一个数组变量
  • 将数组变量作为参数传递给方法
    举个栗子:
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: [c b]
Sample in Test function: [d b]
Sample1 After Test Function Call: [a b]

在上例中,

  • 将simple1赋值给simple2后,修改simple2的第一个元素,simple1的值并没有改变。因为数组的复制是值复制,simple2的修改并不会对simple1产生影响
  • 将simple1作为参数传递给test方法,在方法中修改数组第一个元素。simple1的值同样不会被改变。因为数组作为参数传入方法时发生了值复制。

切片的复制

golang的builtin包提供的copy方法可以用来复制切片。该方法返回成功复制元素的个数,签名如下:

func copy(dst, src []Type) int

被复制的元素个数是dst和src中短的那个。同时注意一旦复制,对dst的任何修改都不会影响到src,反之亦然。

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]

参考:Copy an array or slice in Go (Golang)

相关文章

  • Golang:数组与切片的复制

    在Golang中,数组是值类型而切片是引用类型。因此值的复制与切片的复制并不相同。 数组的复制 对于值类型的数组来...

  • Golang数组与切片

    Golang数组与切片 数组的声明 Golang中的数组属于静态数组,不允许动态扩展 Golang中数组会默认初始...

  • 数组与切片-GOLANG

    golang -@amazeUI -2017-08-02 14:19:14 a := [10]int{1, 2, ...

  • golang 数组与切片

    1. 切片与数组对比 (1). 列表数组是具有固定长度且拥有零个或者多个相同数据类型元素的序列。数组的长度是数组类...

  • 数组与切片 golang

    b 等于 a 的第四个元素到最后一个元素。这是取数组的一部分出来,也可以写作 a[5:],a[5:len(a)],...

  • 一篇文章理解 golang 中切片与数组的关系

    起始 在 golang 文档中,对数组与切片有一些详细的讲解,本文主要讲解数组与切片的关系 由于是个人理解,可能有...

  • 简记python的tuple和slice

    python也有类似于golang中数组和切片的概念。python中的数组为tuple(固定的),切片为list(...

  • Golang 数组 切片

    Golang 数组和切片 go提供了相应数据类型来存储多个相同类型的元素。它们分别是数组和slice切片。其中,切...

  • Golang 中的数组 (array) 和切片 (slice)

    huangwenwei - 字里行间 | Golang 中的数组 (array) 和切片 (slice) 中文描述...

  • Golang数组和切片的区别

    Golang数组和切片的区别 大纲 数组是固定大小 切片不是动态数组,可以扩容 区别 定义方式不一样 初始化方法不...

网友评论

      本文标题:Golang:数组与切片的复制

      本文链接:https://www.haomeiwen.com/subject/akpetktx.html