GO基础之slice和map常见用法以及原理剖析

下载 (1).jpg

1、slice

1.1 slice的三种初始化方式

1.1.1.通过一个现成的数组进行初始化

	allCourses := [5]string{"gin", "go", "grpc", "gorm", "k8s"}
	fmt.Printf("%T\r\n", allCourses) //输出数组的类型
	fmt.Println(allCourses)          //输出数组的内容

	courses := allCourses[2:4]    //从一个现有的数组进行初始化,[start:end]表示取数组下标[start,end)
	fmt.Printf("%T\r\n", courses) //输出数据类型
	fmt.Println(courses)          //输出数据内容

/*输出结果:
[5]string
[gin go grpc gorm k8s]
[]string
[grpc gorm]
*/

1.1.2.通过使用type{}进行初始化

	allCourses := [5]string{"gin", "go", "grpc", "gorm", "k8s"}
	fmt.Printf("%T\r\n", allCourses) //输出数组的类型
	fmt.Println(allCourses)          //输出数组的内容

	courses := []string{"grpc", "gorm"} //通过直接使用[]string{}进行初始化
	fmt.Printf("%T\r\n", courses)       //输出数据类型
	fmt.Println(courses)                //输出数据内容
/*
输出结果:
[5]string
[gin go grpc gorm k8s]
[]string
[grpc gorm]
*/

1.1.3.通过使用make函数进行初始化

	allCourses := [5]string{"gin", "go", "grpc", "gorm", "k8s"}
	fmt.Printf("%T\r\n", allCourses) //输出数组的类型
	fmt.Println(allCourses)          //输出数组的内容

	courses := make([]string, 3)  //通过make函数进行初始化
	courses = append(courses, "go")//调用append函数向slice中添加元素
	fmt.Printf("%T\r\n", courses) //输出数据类型
	fmt.Println(courses)          //输出数据内容

/*
输出结果:
[5]string
[gin go grpc gorm k8s]
[]string
[   go]
*/

其中make(type, len, cap), type表示切片的类型,len表示slice的长度,cap表示slice的容量,详情看后续解析原理部分

1.2 向slice中添加元素–调用append函数

1.2.1 append单独添加一个元素

调用append函数向给定的slice末尾添加一个元素,函数返回值是添加元素后一个新的slice

	allCourses := []string{"gin", "go", "grpc", "gorm", "k8s"}
	fmt.Printf("%p\r\n", allCourses) //原slice的地址
	fmt.Println(allCourses)

	allCourses = append(allCourses, "c")
	fmt.Printf("%p\r\n", allCourses) //新slice的地址
	fmt.Println(allCourses)

/*输出结果:
0xc00006e050
[gin go grpc gorm k8s]
0xc00007e0a0
[gin go grpc gorm k8s c]
*/

1.2.1 利用append添加一个slice

在特定的情境下需要将两个同类型的slice合并,一种做法是利用for循环

	coursesA := []string{"gin", "go", "grpc", "gorm", "k8s"}
	coursesB := []string{"java", "spring"}
	fmt.Println(coursesA, coursesB)

	for _, value := range coursesA {
		coursesB = append(coursesB, value)
	}
	fmt.Println(coursesA, coursesB)
/*
输出结果:
[gin go grpc gorm k8s] [java spring]
[gin go grpc gorm k8s] [java spring gin go grpc gorm k8s]
*/

另一中比较优雅的方法就是通过append结合省略号添加整个slice

	coursesA := []string{"gin", "go", "grpc", "gorm", "k8s"}
	coursesB := []string{"java", "spring"}
	fmt.Println(coursesA, coursesB)

	//for _, value := range coursesA {
	//	coursesB = append(coursesB, value)
	//}

	coursesB = append(coursesB, coursesA...)
	fmt.Println(coursesA, coursesB)
/*
输出结果:
[gin go grpc gorm k8s] [java spring]
[gin go grpc gorm k8s] [java spring gin go grpc gorm k8s]
*/

1.3 slice中元素的删除与拷贝

1.3.1 slice中元素的删除

在一个slice中想要删除元素并没有现成的函数,因此需要通过合理使用append进行拼接从而达到删除元素的目的

	course := []string{"go", "gin", "java", "spring", "tomcat", "grpc", "gorm"}
	course = append(course[:2], course[5:]...)
	fmt.Println(course)
/*
输出结果:
[go gin grpc gorm]
*/

1.3.2 将slice元素进行拷贝

利用copy函数对slice进行拷贝,其中copy函数第一个参数是dst,第二个参数是src,返回值是拷贝元素的个数。在这里需要注意的是,拷贝元素的个数受限于dst切片的len,而非cap

	courses := []string{"go", "grpc", "gorm"}
	var coursesA []string //声明一个长度容量为0的切片
	fmt.Println(copy(coursesA, courses))
	fmt.Println(coursesA)

	coursesB := make([]string, 1, 3) //声明一个len=1, cap=2的切片
	fmt.Println(copy(coursesB, courses))
	fmt.Println(coursesB)
/*
输出结果:
0
[]
1
[go]
*/

如有建议,欢迎提出,感激不尽

后续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值