切片
切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型,这个片段可以整个数组亦或是由起始和终止索引的一些项的子集。(终止索引标识的项不包括在切片内)。与数组相比,切片是一个可变长数组,其长度在运行时是可以进行修改 (多个切片如果表示同一个数组,他们的数据可以共享)
切片的容量,可以用append来进行增加,每次扩容增加2倍的空间,大致如以下
func AppendToSlice(mySlice []int, data ...int) []int {
//取出原切片长度
source := len(mySlice)
//计算添加之后的长度
destination := source + len(data)
//如果添加之后的切片长度大于容量
if destination > cap(mySlice) {
//重新分配 两倍长度
newSlice := make([]int, (destination + 1) * 2)
//拷贝原来的数据
copy(newSlice, mySlice)
//修改原来的切片
mySlice = newSlice
}
//重新切!
mySlice = mySlice[0:destination]
//将新的数据在后面添加进去
copy(mySlice[source:destination], data)
return mySlice
}
切片的应用
写个好玩的,就是用切片操作map,map本身是无序的,不过可以用切片将map的key进行排序,大致如下
//排序
//创建sourceMap的切片
sortKey := make([]string, len(sourceMap))
//给切片赋sourceMap的Key值
i := 0
for k, _ := range sourceMap{
sortKey[i] = k
i++
}
//切片排序
sort.Strings(sortKey)
fmt.Println("sort")
//输出排序之后的key,以及sourceMap中key所对应
for _, k := range sortKey {
fmt.Printf("key is %v, value is %v \n", k, sourceMap[k])
}
还可以用切片将map的key-value进行反转,之后再排序输出!
//反转
inverseMap := make(map[int]string, len(sourceMap))
for k, v := range sourceMap{
inverseMap[v] = k
}
fmt.Println("inverted:")
for k, v := range inverseMap{
fmt.Printf("key: %v, value: %v \n", k, v)
}
//排序
sortKey := make([]int, len(inverseMap))
i := 0
for k, _ := range inverseMap {
sortKey[i] = k
i++
}
sort.Ints(sortKey)
fmt.Println("sort")
for _, k := range sortKey{
fmt.Printf("key is %v, value is %v \n", k, inverseMap[k])
}
切片还是很好用的吧!啊哈哈哈
Q.E.D.