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]
*/
如有建议,欢迎提出,感激不尽
后续更新中…