美文网首页
GO学习 深拷贝和浅拷贝

GO学习 深拷贝和浅拷贝

作者: 3天时间 | 来源:发表于2022-05-19 22:18 被阅读0次

    切片是引用类型

    package main

    import "fmt"

    func main() {

      /*

      按照类型来分:

        基本类型:int,float,string,bool

        复合类型:array,slice,map,struct,pointer,finction,chan

      按照特点来分:

        值类型:int,float,string,bool,array

          传递的是数据副本

        引用类型:slice

          传递的地址,多个变量指向了同一块内存地址。

      所以:切片是引用类型的数据,存储了底层数组的引用

      */

      //1.数组:值类型

      a1 := [4]int{1,2,3,4}

      a2 := a1 //值传递:传递的是数据

      fmt.Println(a1,a2)

      a1[0] = 100

      fmt.Println(a1,a2)

      //2.切片:引用类型

      s1 :=[]int{1,2,3,4}

      s2 := s1

      fmt.Println(s1,s2)

      s1[0] = 100

      fmt.Println(s1,s2)

      fmt.Printf("%p\n",s1)

      fmt.Printf("%p\n",s2)

      fmt.Printf("%p\n",&s1)

      fmt.Printf("%p\n",&s1)

    }

    运行输出:

    [1 2 3 4] [1 2 3 4]

    [100 2 3 4] [1 2 3 4]

    [1 2 3 4] [1 2 3 4]

    [100 2 3 4] [100 2 3 4]

    0xc000014460

    0xc000014460

    0xc0000044c0

    0xc0000044c0

    Process finished with exit code 0

    图解:

    图片过大无法上传

    深拷贝和浅拷贝

    package main

    import "fmt"

    func main() {

      /*

      深拷贝:拷贝的是数据本身。

        值类型的数据,默认都是深拷贝:array,int,float,string,bool,struct

      浅拷贝:拷贝的是数据地址。

        导致多个变量指向同一块内存

        引用类型的数据,默认都是浅拷贝:slice,map

        因为切片是引用类型的数据,直接拷贝的是地址。

      func copy(dst,src[]Type)int

        可以实现切片的拷贝

      */

      s1 := []int{1,2,3,4}

      s2 := make([]int,0) //len:0,cap:0

      for i:=0;i<len(s1);i++{

        s2 = append(s2,s1[i])

      }

      fmt.Println(s1)

      fmt.Println(s2)

      s1[0] = 100

      fmt.Println(s1)

      fmt.Println(s2)

      //copy()

      s3 := []int{7,8,9}

      fmt.Println(s2)

      fmt.Println(s3)

      //copy(s2,s3)//将s3中的元素,拷贝到s2中

      //copy(s3,s2)//将s2中的元素,拷贝到s3中

      copy(s3[1:],s2[2:])

      fmt.Println(s2)

      fmt.Println(s3)

    }

    运行输出:

    [1 2 3 4]

    [1 2 3 4]

    [100 2 3 4]

    [1 2 3 4]

    [1 2 3 4]

    [7 8 9]

    [1 2 3 4]

    [7 3 4]

    Process finished with exit code 0

    读完点个赞,给我的坚持更新注入新的活力。

    2022.05.19日更 72/365 天

    公众号:3天时间

    往期同类文章:

    GO学习 数组上创建切片

    GO学习 slice

    GO学习 多维数组

    GO学习 Array类型和排序

    GO学习 Array

    相关文章

      网友评论

          本文标题:GO学习 深拷贝和浅拷贝

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