切片是引用类型
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
网友评论