切片


切片(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.


一个追风车的傻子