美文网首页
Go slice copy复制和等号复制的区别

Go slice copy复制和等号复制的区别

作者: Hmcf | 来源:发表于2019-11-26 09:28 被阅读0次

copy复制为值复制,改变原切片的值不会影响新切片。而等号复制为指针复制,改变原切片或新切片都会对另一个产生影响。copy复制会比等号复制慢(很好理解)。

下面看一下具体的例子。

等号

package main

import "fmt"

func main() {
    a := [3]int{0, 1, 2}
    s := a[1:2]
    fmt.Println(a, s)   // [0 1 2] [1]
    s[0] = 11

    fmt.Println(a, s)   // [0 11 2] [11]
    s = append(s, 12)   // 底层还是a的容量
    s = append(s, 13)   //再追加13之前s用的是a的部分空间,追加到13以后发生扩容搬家了
    fmt.Println(a, s)   // [0 11 12] [11 12 13]
    s[0] = 21

    fmt.Println(a, s)   // [0 11 12] [21 12 13]
}

copy

package main

import "fmt"

func main() {
    a := []int{0, 1, 2}
    s := make([]int, 3)
    copy(s, a)
    fmt.Println(a, s)   // [0 1 2] [0 1 2]
    s[0] = 11

    fmt.Println(a, s)   // [0 1 2] [11 1 2]
    s = append(s, 12)
    s = append(s, 13)
    fmt.Println(a, s)   // [0 1 2] [11 1 2 12 13]
    s[0] = 21

    fmt.Println(a, s)   // [0 1 2] [21 1 2 12 13]
}

需要注意的是,copy函数接收的参数类型为[]type形式,像上面等号复制里面的[3]int{0,1,2} 这种形式是不被认可的。

相关文章

网友评论

      本文标题:Go slice copy复制和等号复制的区别

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