Go语言入门16--- 切片是引用数据类型&&深拷贝和浅拷贝&&初识map|Go主题月

149 阅读1分钟

切片是引用数据类型

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

package main

import "fmt"

func main() {
	//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",&a1)
	fmt.Printf("%p\n",&a2)

}

image.png

深拷贝和浅拷贝

package main

import "fmt"

func main() {
	/*
	深拷贝:拷贝的是数据本身。
	值类型的数据,默认都是深拷贝:array,int,float,
	string,bool,struct

	浅拷贝:拷贝的是数据地址
		导致多个变量指向同一块内存
	引用类型的数据,默认都是浅拷贝:slice,map
	 */
	s1:=[]int{1,2,3,4}
	s2:=make([]int,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)

	s3:=[]int{7,8,9}
	fmt.Println(s2)
	fmt.Println(s3)

	//copy(s2,s3)//将s3中元素拷贝到s2中
	//copy(s3,s2)
	copy(s3[1:],s2[2:])
	fmt.Println(s2)
	fmt.Println(s3)
}

image.png

map初识

package main

import "fmt"

func main() {
	/*
	map:映射,是一种专门用于存储键值对的集合,属于引用类型

	存储特点:
		A.存储的是无序的键值对
		B.键不能重复,并且和value值一一对应的
			map中key不能重复。如果重复,新的value会覆盖原来的。
	语法结构:
		1.创建map
	 */
	//创建map
	var map1 map[int]string
	var map2=make(map[int]string)
	var map3=map[string]int{"Go":98,"Python":87,"java":79,"Html":93}
	fmt.Println(map1)
	fmt.Println(map2)
	fmt.Println(map3)
}

image.png