GO学习 深拷贝和浅拷贝

2022-05-19  本文已影响0人  3天时间

切片是引用类型

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

上一篇下一篇

猜你喜欢

热点阅读